Sed без регулярных выражений

471
sagar

Я использую 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-последовательности?

0
Не могли бы Вы уточнить? Пример ввода и ожидаемый результат, например. Thor 11 лет назад 0
Используйте одинарные кавычки вместо двойных, тогда оболочка оставит эти символы в покое. Thor 11 лет назад 0
но выдает следующую ошибку sed: -e выражение # 1, char 1: неизвестная команда: `'' sagar 11 лет назад 0
Вы пропускаете завершающий `~`. Какая версия sed это? Thor 11 лет назад 0
sed -ne 's ~ ad ~ sss ~ g' -ne 'w output.txt' 'input.txt' Это моя команда, которая выдает ошибку. И версия sed => GNU sed версия 4.2.1 sagar 11 лет назад 0
Эта команда работает здесь. Thor 11 лет назад 0
@Thor Это не работает в моей командной строке. Может ли sed verison быть проблемой? sagar 11 лет назад 0
У меня такая же версия. Попробуйте еще раз набрать команду. Thor 11 лет назад 0
к сожалению, это не работает :-( sagar 11 лет назад 0
Я согласен с @Thor по двум пунктам: (1) команда `sed -ne '~ ad ~ sss ~ g' -ne 'w output.txt' 'input.txt'` выглядит совершенно корректно и работает на моем система. (2) Вы должны объяснить свою проблему лучше. Вы говорите, что хотите «универсальное правило» сразу после того, как говорите, что хотите, чтобы некоторые персонажи представляли себя буквально, в то время как другие реализуют свои функции регулярных выражений. Scott 11 лет назад 0
Я просто не хочу, чтобы регулярное выражение поведения команды sed. Я хочу, чтобы все аргументы, предоставленные sed для поиска и замены, рассматривались как простой текст, независимо от чего-либо sagar 11 лет назад 0
Привет, ребята, спасибо за ваши ответы! Моя проблема была решена. Я работаю над версией sed на windws 7. Я использовал ниже синтаксис sed. sed -nre "s ~ a \ .d ~ sss ~ g; w output.txt" "input.txt". Поскольку я использовал опцию -r, я экранирую все специальные символы, которые используются в регулярном выражении. sagar 11 лет назад 0

1 ответ на вопрос

1
POW

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

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

sed -rn '/\x22/p' file 

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

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

gawk 'BEGIN}' null >chars.txt 
Это, кажется, прямо отвечает на два ясных вопроса, которые задает ФП. simlev 6 лет назад 1

Похожие вопросы