Я знаю, что об этом уже спрашивали, но у меня проблемы с пониманием ответов, которые я нашел. По сути, я хочу использовать
sed -i 's/string//some/directory/g' file.txt
и не могу найти прямого ответа, как сделать так, чтобы/some/directory
не нарушал синтаксис sed
.
sed
допускает использование нескольких синтаксических разделителей, причем /
является наиболее часто используемым.
С тем же успехом можно сказать
sed -i 's,<string>,<some/directory>,g' file.txt
, где ,
теперь имеет функцию, обычно выполняемую /
, тем самым освобождая последнее от его особого значения.
Обратите внимание, однако (, как указал @Jeff Schaller ), что теперь ,
не должен появляться в имени файла или каталога -и это допустимый символ для имен файлов!Этот ответ дает хороший обзор того, как действовать при применении sed
к строке со специальными символами.
Замена разделителя на тот, который, как известно, не появляется в строках поиска или замены, является хорошим вариантом, когда вы можете найти разделитель, который не появляется в них. Я предпочитаю использовать знак плюс, а не запятую, но это скорее дело привычки.
Однако, если вы не можете найти разделитель, который не появляется в строке, всегда есть обратная косая черта -экранирующая:
sed -e 's/<string>/<some\/directory>/g' file.txt
\
перед косой чертой позволяет sed
понять, что это просто косая черта, а не разделитель.
@AdminBee До сих пор я видел только #
в качестве разделителя, думаю, он встречается в шаблонах реже, чем запятая:
sed -i 's#<string>#<some/directory>#g' file.txt