Ребята из GNU ДЕЙСТВИТЕЛЬНО перепутались, когда представили рекурсивный поиск файлов в grep. grep предназначен для поиска RE в файлах и печати соответствующей строки (g/re/p помните?) НЕ для поиска файлов. Есть отличный инструмент с очень очевидным именем для файлов FINDing. Что бы ни случилось с мантрой UNIX, чтобы сделать одно и сделать это хорошо?
Во всяком случае, вот как вы могли бы сделать то, что вы хотите использовать традиционный UNIX подход (непроверенные):
find /path/to/folder -type f -print |
while IFS= read -r file
do
awk -v old="$oldstring" -v new="$newstring" '
BEGIN{ rlength = length(old) }
rstart = index($0,old) { $0 = substr($0,rstart-1) new substr($0,rstart+rlength) }
{ print }
' "$file" > tmp &&
mv tmp "$file"
done
Не то, что с помощью AWK/индекс() вместо СЕПГ и Grep вам избежать необходимость избегайте всех метасимволов RE, которые могут появляться либо в вашей старой, либо в вашей новой строке, плюс выведите символ, который будет использоваться в качестве разделителя sed, который не может отображаться в ваших старых или новых строках, и что вам не нужно запускать grep поскольку замена будет происходить только для файлов, содержащих нужную строку. Сказав все это, если вы не хотите, чтобы временная метка файла изменилась, если вы не изменяете файл, просто выполните diff для tmp и исходного файла перед выполнением mv или введите fgrep -q до AWK.
Предостережение. Вышеупомянутое не будет работать для имен файлов, содержащих символы новой строки. Если у вас есть, то дайте нам знать, и мы сможем показать вам, как с ними справиться.
квадратные скобки, возможно, должны быть экранированы. Также дважды укажите шаблон sed. – phs
У вас также будет проблема с '/' в ваших шаблонах. Им следует избегать. Или вы можете использовать другой разделитель для команды '' '(например,' @ '). –