Unix HP-UX ksh рекурсивный поиск и замена

1170
user187195

Я пытаюсь сделать рекурсивный поиск и замену в HP-UX, и мне чего-то не хватает.

Что имею на данный момент:

find . -name "*.java" | xargs sed 's/foo/bar/g' 

Я знаю, проблема в том, что он не заменяет встроенный файл. Я считаю, что в других ОС есть флаг -i, но, похоже, в моей версии HP-UX его нет.

Какие-либо предложения?

3
Редактирование на месте для `sed` - это не POSIX, что объясняет, почему оно недоступно для вас. Вместо этого вы можете попробовать Perl, если он доступен, поскольку в Perl есть опция `-i`, которая делает то же самое. http://backreference.org/2011/01/29/in-place-editing-of-files/ содержит некоторую информацию. Только не пытайтесь слепо попробовать что-то без поддержки! Daniel Andersson 11 лет назад 1
Спасибо Даниэль. Использование Perl было способом, который работал для меня: найти. имя "* .java" | xargs perl -pi -e's / foo / bar / g ' user187195 11 лет назад 1
Также спросили на StackOverflow: http://stackoverflow.com/q/14278552/7552 glenn jackman 11 лет назад 0
просто достаньте Xargs и оставьте sed. Tim Kennedy 11 лет назад 0

2 ответа на вопрос

1
sparkie

you could workaround the missing -i like this (untested):

for i in `find . -name "*.java"`; do cp $i /tmp/$$; sed 's/foo/bar/g' < /tmp/$$ > $i;done 
1
glenn jackman

You could always use ed

find . -name "*.java" | while IFS= read -r file; do ed "$file" <<ED_COMMANDS %s/foo/bar/g w q ED_COMMANDS done