Я хочу заменить это:
<li><a href="autor.php?<?=$a?>">Autor</a></li>
чтобы:
<li><a href="autor.php?<?=$a?>">Autor</a></li><li><a href="QTY.php?<?=$a?>">QTY</a></li>
С этим кодом:
find www/ -type f -exec sed -i 's/\"\<li\>\<a href=\"autor.php\?\<\?\=\$a?\>\"\>Autor\<\/a\>\<\/li\>\"\/\"\<li\>\<a href=\"autor.php\?\<\?=\$a\?>\">Autor\<\/a\>\<\/li\>\<li\>\<a href=\"QTY.php\?\<\?=\$a\?\>\"\>QTY\<\/a\>\<\/li\>\"/g' {} \;
И я получаю эту ошибку:
sed: -e expression #1, char 211: unterminated `s' command
Я думаю, что проблема в том, что вы избегаете «разделитель» (в первом случае /
во втором случае -
) так что sed не интерпретирует это как следует. Попробуйте заменить промежуточный \-
по -
,
Синтаксис для команды ‘s’:
s/foo/bar/
но у вас есть только два символа ‘/’ в строке, которые не экранированы.
Я бы порекомендовал вам перекомпоновать замену, используя другой разделитель. То есть Вы также можете использовать:
s-foo-bar-
find www/ -type f -exec \
sed -i '\#<li><a href="autor.php?<?=\$a?>">Autor</a></li># {
s##&<li><a href="QTY.php?<?=\$a?>">QTY</a></li>#
}' {} \;
{}
в действии и \
, Используйте это для ясность /
для простоты в действии sed, избегая экранирования этого персонажа (#
Вот).s///
действие, но также может быть сделано непосредственно (также для ясности). Я использую s//
Поведение для этого, где //
значит, последнее исследуемое регулярное выражение, а также &
внутри шаблона замены (найдено содержимое шаблона)Просто используйте строковые операторы вместо регулярных выражений и «специального» шаблона замены sed:
$ cat file
foo<li><a href="autor.php?<?=$a?>">Autor</a></li>bar
$ awk -v tgt='<li><a href="autor.php?<?=$a?>">Autor</a></li>' \
-v add='<li><a href="QTY.php?<?=$a?>">QTY</a></li>' '
s=index($0,tgt) { $0 = substr($0,1,s+length(tgt)-1) add substr($0,s+length(tgt)) }
1' file
foo<li><a href="autor.php?<?=$a?>">Autor</a></li><li><a href="QTY.php?<?=$a?>">QTY</a></li>bar