2015-11-24 5 views
0

У меня есть следующий скрипт для замены текста.найти, а затем grep, а затем перебрать список файлов

grep -l -r "originaltext" . | 
while read fname 
do 
sed 's/originaltext/replacementText/g' $fname > tmp.tmp 
mv tmp.tmp $fname 
done 

Теперь в первом утверждении этого сценария я хочу сделать что-то подобное.

find . -name '*.properties' -exec grep "originaltext" {} \; 

Как это сделать?
Я работаю над AIX, поэтому --include-file не работает.

ответ

1

В вообще, я предпочитаю использовать find для файлов FIND, а не grep. Это выглядит очевидным:)

Использование process substitution вы можете кормить петлю while с результатом find:

while IFS= read -r fname 
do 
    sed 's/originaltext/replacementText/g' $fname > tmp.tmp 
    mv tmp.tmp $fname 
done < <(find . -name '*.properties' -exec grep -l "originaltext" {} \;) 

Примечание Я использую grep -l (большой L), так что grep просто возвращает имя файла Сопрягать шаблон.

+1

, который работает для меня, спасибо. – Ahmad

+0

Привет, fedorqui, похоже, что этот файл «* .properties» не работает. Если я повторяю fname в цикле, я не вижу файл свойств – Ahmad

+1

@Ahmad Я действительно не следил за вашей целью. Поскольку вы используете 'find ... -exec grep', вы можете сказать' grep -l' (то есть нижний регистр 'L'), чтобы он просто указывал имя файла в качестве вывода. – fedorqui

1

Вы можете пойти в другую сторону и предоставить список файлов * .properties для grep. Например

grep -l "originaltext" `find -name '*.properties'` 

Да, и если вы на недавнем Дистрибутив Linux, есть вариант в Grep для достижения этой цели без необходимости создавать этот длинный список файлов в качестве аргумента

grep -l "originaltext" --include='*.properties' -r . 
+0

первый не работает и, как я уже упоминал, второй вариант недоступен для меня. Спасибо в любом случае за ваш ответ – Ahmad

+0

К сожалению, не прочитал последнюю строку, извините. Хорошо прочитал ответ Фёдорки. –

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