2016-10-06 5 views
0

С переходом на лучшую систему управления я хочу удалить все избыточные журналы в верхней части каждого из исходных файлов. В Notepad ++ я смог добиться результата, используя «заменить в файлах» и заменив совпадения на \A(//.*\n)+ пустым. Однако на Linux мне не хватает такой удачи, и мне нужно прибегнуть к «xargs» и «sed».Как перенаправить put of xargs при использовании sed

СЕПГ выражение я использую:

sed '1,/^[^\/]/{/^[^\/]/b; d}'

Гадкий, чтобы быть уверенным, но это не похоже на работу.

Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь запустить это через «xargs», чтобы передать все исходные файлы в нашей системе. Я не могу перенаправить вывод на «разделенные» файлы, которые я тогда намереваюсь для копирования оригиналов.

Я хочу что-то в строке:

find . -name "*.com" -type f -print0 | xargs -0 -I file sed '1,/^[^\/]/{/^[^\/]/b; d}' "file" > "file.stripped"

Однако у меня горе Проходя мимо «>» до принимающей среды (оболочки), как я уже использую слишком много кавычек , Я пробовал всевозможные экранизации и оболочки «обертки», но я просто не могу заставить его играть в мяч.

Кто-нибудь хочет указать мне в правильном направлении?

Thanks, Slarti.

+0

Поддерживает ли ваша реализация СЭД в '-i' вариант? – choroba

+0

Есть, да. Это облегчает жизнь. Я отдам его и вернусь к вам;) – Slartibartfast

+0

Зачем вам идти с опцией -exec в поиске. Что-то похожее на это: «Найди. -name "* .com" -type f -print0 -exec sed '1,/^ [^ \ /]/{/^[^ \ /]/b; d} '{}> "file.stripped" \; ' –

ответ

0

Я сделал подобный сценарий с более простым SED выражения только в качестве примера, увидеть, если он работает для вас:

Я создал 3 файла со строкой «ABCD» внутри каждого:

# ls -l 
total 12 
-rw-r--r-- 1 root root 5 Oct 6 09:05 test.aaaaa.com 
-rw-r--r-- 1 root root 5 Oct 6 09:05 test2.aaaaa.com 
-rw-r--r-- 1 root root 5 Oct 6 09:05 test3.aaaaa.com 
# cat test* 
abcd 
abcd 
abcd 

Запуск команды find, как вы показывали, используя параметр -exec вместо xargs, и заменяя выражение sed для глупого, которое просто заменяет все «a» для «b» и параметр -i, который напрямую записывает входной файл:

# find . -name "*.com" -type f -print0 -exec sed -i 's/a/b/g' {} \; 
./test2.aaaaa.com./test3.aaaaa.com./test.aaaaa.com 
# cat test* 
bbcd 
bbcd 
bbcd 

В вашем случае это должно выглядеть следующим образом:

# find . -name "*.com" -type f -print0 -exec sed -i '1,/^[^\/]/{/^[^\/]/b; d}' {} \; 
+0

Спасибо. Это действительно сработало отлично. Из полноты, однако, любая идея о том, как можно перенаправить вывод? – Slartibartfast

+0

Это не может быть достигнуто с помощью параметра xargs -I, потому что после знака «>», используемого для перенаправления вывода, он понимает, что он больше не является частью аргументов команды, поэтому он не заменяет «файл».stripped "для фактического имени файла" find "дает вам и заканчивает создание литерального файла file.stripped. Вы можете написать сценарий, используя команду« for »в сочетании с« find »и« xargs »для достижения этого , но это не самый умный и простой способ сделать это. Кроме того, не забудьте перечесть мой ответ.;) Приветствия! – AFAbyss

 Смежные вопросы

  • Нет связанных вопросов^_^