Я использую GNU SED для поиска и замены функциональности больших файлов (до 2 ГБ).

Символы поиска и замены могут содержать любые символы, поэтому я хочу, чтобы параметры поиска и замены обрабатывались как простой текст.

Я не хочу рассматривать или находить или заменять параметры как регулярное выражение с помощью команды sed.

Я много экспериментировал, но каждый раз получаю новые комбинации регулярных выражений, которые не работают для sed в виде простого текста.

Как этого достичь?

Есть ли какая-нибудь формула, чтобы избежать специальных символов?

Примечание: я использую оператор ~ как разделитель команд вместо /

Ниже приведен пример

sed -ne "s~^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$~Replace" -ne "w output.txt" "input.txt"

Вышеуказанная команда не работает, так как она обрабатывает параметр поиска как регулярное выражение (как и регулярное выражение). Следовательно, чтобы найти текст, мне нужно экранировать некоторые специальные символы в регулярном выражении, как показано ниже

sed -ne "s~\^\[-+\]?\[0-9\]\*\\.?\[0-9\]+(\[eE\]\[-+\]?\[0-9\]+)?\$~Replace" -ne "w output.txt" "input.txt"

В другом примере я должен изменить .*$ Для .\*\$ Но в (.*$) Я не хочу вводить данные.

Так есть ли универсальное правило для escape-последовательности?

1 ответ1

1

В: Есть ли какая-нибудь формула для экранирования специальных символов?
Q: Есть ли универсальное правило для escape-последовательности?

A: Вы можете использовать соответствующий шестнадцатеричный код для специальных символов, в тех случаях , когда просто набрав / , * , $ и т. д. становится раздражающим. Например:

sed -rn '/\x22/p' file

напечатает строки, содержащие двойные кавычки, так как \x22 представляет " .

Если вам нужно посмотреть шестнадцатеричные коды, вы можете удобно сохранить их все в файл с помощью этой команды:

gawk 'BEGIN{for(i=0;i<255;i++){printf("%d\t%x\t%c\n", i,i,i)}}' null >chars.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .