Ответ 1
Как сказал @Didier, вы можете изменить свой разделитель на нечто, отличное от /
:
grep -rl $oldstring /path/to/folder | xargs sed -i [email protected][email protected][email protected]
Я получаю
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
Как сказал @Didier, вы можете изменить свой разделитель на нечто, отличное от /
:
grep -rl $oldstring /path/to/folder | xargs sed -i [email protected][email protected][email protected]
grep -rl $oldstring . | xargs sed -i "s/$oldstring/$newstring/g"
Ребята из 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.
Предостережение. Вышеуказанное не будет работать для имен файлов, содержащих новые строки. Если у вас есть, то дайте нам знать, и мы сможем показать вам, как с ними справиться.
sed
выражение должно быть указано
sed -i "s/$oldstring/$newstring/g"
grep -rl SOSTITUTETHIS . | xargs sed -Ei 's/(.*)SOSTITUTETHIS(.*)/\1WITHTHIS\2/g'