Мне нужно заменить текст внутри текстового файла с заменой. Обычно я хотел бы сделать что-то вроде
sed -i 's/text/replacement/g' path/to/the/file
Проблема в том, что оба text
и replacement
являются сложными строками, содержащими тире, косые черты, черные черты, кавычки и так далее. Если я уберу все необходимые символы внутри, text
вещь станет быстро нечитаемой. С другой стороны, мне не нужна сила регулярных выражений: мне просто нужно заменить текст буквально.
Есть ли способ сделать подстановку текста без использования регулярных выражений с какой-то командой bash?
Было бы довольно тривиально написать скрипт, который делает это, но я думаю, что что-то уже должно существовать.
bash
regex
sed
text-editing
Andrea
источник
источник
find and replace all
bash
всегда поставляются с Microsoft Word? ;) Нет, просто прикалываюсь. ОП может захотеть сделать это на удаленной машине или для пакета файлов, хотя.sed
, что, вероятно, бесполезно, учитывая все различия между коммутаторами и платформами.Ответы:
Когда вам не нужна сила регулярных выражений, не используйте ее. Это хорошо.
Но это не совсем регулярное выражение .
sed 's|literal_pattern|replacement_string|g'
Так что, если
/
это ваша проблема, используйте,|
и вам не нужно избегать первого.ps: о комментариях, также посмотрите этот ответ Stackoverflow на Escape-строку для шаблона поиска sed .
Обновление: если вы хорошо используете Perl, попробуйте
\Q
и\E
вот так,perl -pe 's|\Qliteral_pattern\E|replacement_string|g'
RedGrittyBrick
также предложили подобный трюк с более сильным синтаксисом Perl в комментарии здесьисточник
s|||
иs///
заключается в том, что разделительный символ отличается и поэтому один символ не нуждается в экранировании. Вы могли бы в равной степени сделатьs###
. Реальная проблема здесь в том, что OP не хочет беспокоиться о экранировании содержимогоliteral_pattern
(которое не является буквальным и будет интерпретироваться как регулярное выражение).1234.*aaa
с вашим решением будет соответствовать гораздо больше, чем предполагалось1234\.\*aaa
.Это единственное 100% безопасное решение здесь, потому что:
sed
)}
символ (таким образом, превосходит представленное решение Perl)ENV['FIND']
используется, а не$FIND
. Если$FIND
ваш текст встроен в код Ruby, вы можете получить синтаксическую ошибку, если ваша строка содержит неэкранированный код'
.источник
export FIND='find this; export REPLACE='replace with this';
в моем bash-скрипте так, чтобыENV['FIND']
иENV['replace']
имел ожидаемые значения. Я заменял некоторые действительно длинные зашифрованные строки в файле. Это был просто билет.Команда
replace
сделает это.https://linux.die.net/man/1/replace
Изменить место:
В стандартный вывод:
Пример:
Команда
replace
поставляется с MySQL или MariaDB.источник
Вы также можете использовать
\Q
механизм Perl для « цитирования (отключения) метасимволов »источник
perl -pe 's(\Qyour */text/?goes"here")(replacement)' file
зацени мой Perl скрипт он делает именно то, что вам нужно, без явного или явного использования регулярного выражения:
https://github.com/Samer-Al-iraqi/Linux-str_replace
очень удобно, верно? Я должен был изучить Perl, чтобы сделать это. потому что мне действительно это нужно.
источник
Вы можете сделать это, избегая своих шаблонов. Нравится:
Кредиты для этого решения идет здесь: https://stackoverflow.com/questions/407523/escape-a-string-for-a-sed-replace-pattern
Примечание 1: это работает только для непустых ключевых слов. Пустые ключевые слова не принимаются sed (
sed -e 's//replacement/'
).Примечание 2: к сожалению, я не знаю популярного инструмента, который бы НЕ использовал regexp-s для решения проблемы. Вы можете написать такой инструмент на Rust или C, но его нет по умолчанию.
источник
Я собрал несколько других ответов и придумал это:
источник
\n
. Любое решение?Вы можете использовать php's str_replace :
Примечание: вам все равно придется избегать одинарных
'
и двойных кавычек"
.источник
Node.JS эквивалент @Nowaker:
источник
Вот еще один «почти» рабочий путь.
Используйте vi или vim.
Создайте текстовый файл с вашей заменой:
затем выполните vi или vim из командной строки:
:% sno - команда vi для поиска и замены без магии.
/ мой выбранный разделитель.
: x сохраняет и выходит из vi.
Вы должны избегать обратной косой черты '\' прямая косая черта '/' может быть заменена, например, вопросительным знаком '?' или что-то еще, чего нет в вашей строке поиска или замены, конвейер '|' не работал для меня, хотя.
ссылка: https://stackoverflow.com/questions/6254820/perform-a-non-regex-search-replace-in-vim https://vim.fandom.com/wiki/Search_without_need_to_escape_slash http://linuxcommand.org/ lc3_man_pages / vim1.html
источник