Подтвердить что ты не робот

Найти и заменить строку во всех рекурсивных файлах с помощью grep и sed

Я получаю

sed: -e expression #1, char 22: unterminated `s' command 

есть ли проблема на моем script? Кроме того, "oldstring" имеет специальные символы

#!bin/bash
oldstring='<script>"[oldscript]"</script>'
newstring='<script>"[newscript]"</script>'
grep -rl $oldstring /path/to/folder | xargs sed -i s/$oldstring/$newstring/g
4b9b3361

Ответ 2

grep -rl $oldstring . | xargs sed -i "s/$oldstring/$newstring/g"

Ответ 3

Ребята из 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/index() вместо sed и grep вы избегаете необходимости избегать всех метасимволов RE, которые могут появляться либо в вашей старой, либо в вашей новой строке, и вычислять символ, который будет использоваться в качестве вашего разделителя sed которые не могут отображаться в старых или новых строках и что вам не нужно запускать grep, поскольку замена будет происходить только для файлов, содержащих нужную строку. Сказав все это, если вы не хотите, чтобы временная метка файла изменилась, если вы не изменяете файл, просто выполните diff для tmp и исходного файла перед выполнением mv или введите fgrep -q до AWK.

Предостережение. Вышеуказанное не будет работать для имен файлов, содержащих новые строки. Если у вас есть, то дайте нам знать, и мы сможем показать вам, как с ними справиться.

Ответ 4

sed выражение должно быть указано

sed -i "s/$oldstring/$newstring/g"

Ответ 5

grep -rl SOSTITUTETHIS . | xargs sed -Ei 's/(.*)SOSTITUTETHIS(.*)/\1WITHTHIS\2/g'