Позвольте мне разбить мою проблему на простейший пример, который я могу.
Создайте тестовый файл, содержащий одну строку текста.
[root@myserver ] /tmp> echo "test ReplaceMe DoNotReplaceMe" > /tmp/daj.txt
У нас есть существующая команда find
, которую мы используем для подстановки текста во всех файлах, которые ему соответствуют (в этом примере я упростил эту команду, чтобы она работала только с одним файлом, и удалил другие, которые он выполняет) ,
Проблема в том, что он заменяет «ReplaceMe» везде, где он появляется, а не только тогда, когда это само слово.
[root@myserver ] /tmp> find /tmp/daj.txt -exec sh -c 'f="{}"; sed -e 's/ReplaceMe/#DONE#/gi' "${f#.}" ' \;
test #DONE# DoNot#DONE#
Я написал новую команду sed
, которая заменяет «ReplaceMe» только тогда, когда оно само по себе является словом, но НЕ, когда оно является подстрокой другого слова. Вывод этой команды правильный.
[root@myserver ] /tmp> cat /tmp/daj.txt | sed -e 's/\(\W\)\(ReplaceMe\)\(\W\)/\1#DONE#\3/gi'
test #DONE# DoNotReplaceMe
Когда я пытаюсь включить обновленную команду sed
в команду find
, она прерывается. Похоже, я столкнулся с проблемой побега, но мне не удалось решить ее, добавив дополнительную побег.
[root@myserver ] /tmp> find /tmp/daj.txt -exec sh -c 'f="{}"; sed -e 's/\(\W\)\(ReplaceMe\)\(\W\)/\1#DONE#\3/gi' "${f#.}" ' \;
sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `f="/tmp/daj.txt"; sed -e s/(W)(ReplaceMe)(W)/1#DONE#3/gi "${f#.}" '
Есть ли способ избежать моей команды sed
, чтобы я мог выполнить ее с помощью find
, или мне нужно искать альтернативное решение?
Обновление: Полная команда find
, которую мы выполняем, распечатывает имя файла и разрешения, а затем передает вывод sed
в md5sum
. Вот пример запуска и сопоставления нескольких файлов:
[root@myserver ] ~> find /tmp -regex '.*daj.*\.txt' -printf '%p %m ' -exec sh -c 'f="{}"; sed -e 's/ReplaceMe/#DONE#/gi' "${f#.}" | md5sum' \;
/tmp/daj2.txt 644 d52bbd311552234b761bcae694c2055a -
/tmp/daj.txt 644 d52bbd311552234b761bcae694c2055a -