Редактировать все файлы на глубине 2 - PullRequest
0 голосов
/ 07 декабря 2018

Я хотел бы выполнить редактирование каждого файла с именем "game.ml" на глубине 2 в определенной файловой иерархии.Я думал написать

find myfiles -depth 2 -type f -name "game.ml" -exec sed -e 's/size = 5/size = 6/'  '{}' > game2.ml  \;

, а затем снова вернуться в каталог и переместить все файлы "game2.ml" обратно в game.ml, переписав оригиналы.На самом деле, я хочу что-то вроде «самостоятельной» операции, но я не знаю ни одной.

Плохая новость заключается в том, что указанная выше команда find помещает game2.ml не в каталог, где был game.ml, а в каталог, из которого был вызван find.

Может кто-нибудь предложить способ решения этой конкретной проблемы или лучший способ решения всей задачи?Либо сделает меня счастливым.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Для POSIX вы можете использовать это find:

find myfiles -depth 2 -type f -name "game.ml" |
while IFS= read -rd '' file; do
   sed 's/size = 5/size = 6/' "$file" > game2.ml
done
0 голосов
/ 07 декабря 2018

Вы можете найти все нужные файлы без find, с шаблоном оболочки myfiles/*/game.ml.

. Редактировать их на месте проще с помощью perl, чем с sed:

perl -p -i.bak -e 's/size = 5/size = 6/' myfiles/*/game.ml

Флаг -p выводит каждую строку ввода в выходной файл (после вычисления выражений).-i.bak редактирует каждый файл на месте, сохраняя оригинал с расширением .bak (т. Е. game.ml.bak).Флаг -e выполняет следующее выражение в каждой строке каждого файла.

Если вы действительно хотите сделать это с sed:

for f in myfiles/*/game.ml; do
    sed 's/size = 5/size = 6/' < "$f" > "$f".new && mv "$f".new "$f"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...