Тестируя команду SED для замены текста, она не выдает ошибку, но она не работает, как предполагалось - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь найти во всех файлах текст и заменить его словом EXAMPLE. Я делаю следующее:

for f in /home/testu/zz*; do
        sed -i "s/&VAR1\s*=\s*'?[1]{4}'?/EXAMPLE/g" "$f"
done

Это не дает ошибки, файлы, кажется, "обновлены" в файловой системе, но они не будут изменены. Если я проверяю это регулярное выражение с помощью команды grep, то он работает нормально, поэтому что-то не так с SED, может ли это быть версия SED?

Спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Текущая команда sed анализирует регулярное выражение как шаблон, совместимый с POSIX BRE.

В BRE POSIX ? соответствует буквальному символу ?, а { / } также соответствует буквальному { / } символам. Чтобы сделать квантификатор диапазона в паттерне BRE POSIX, вам нужно экранировать {...}, \{min,max\}.

[1] равно 1, поэтому скобки здесь довольно избыточны.

Чтобы исправить свой шаблон, вы можете заменить ? на \{0,1\} (0 или 1 вхождение) и {4} на \{4\}:

sed -i "s/&VAR1\s*=\s*'\{0,1\}1\{4\}'\{0,1\}/EXAMPLE/g" "$f"
0 голосов
/ 29 июня 2018

Благодаря советам Wiktor Stribiżew мы получили решение (SSED GNU 4.1.5). Полученное регулярное выражение работает с grep и sed. Код был набором решений в конце.

sed -i "s/&VAR1\s*=\s*'\{0,\}1\{4\}'\{0,\};\{0,\}/EXAMPLE/g" "$f"

Несколько вещей:

Такие вещи, как [[: blank:]] вызвали ошибку входного файла.

Моя версия sed не поддерживала -E, поэтому {} должен был быть экранирован, не знал, что:)

Еще раз спасибо, Виктор!

...