Что случилось с моим lookahead regex в GNU sed?

это то, что я делаю (упрощенный пример):

gsed -i -E 's/^(?!foo)(.*)$/bar/' file.txt

Я пытаюсь поставить bar перед каждой строкой, которая не начинается с foo. Это ошибка:

gsed: -e expression #1, char 22: Invalid preceding regular expression

что случилось?

3 ответов


насколько я знаю sed не имеет ни взгляда вперед, ни взгляда назад. Переключитесь на более мощный язык с похожим синтаксисом, например perl.


sed -i '/^foo/! s/^/bar/' file.txt
  • -i изменить файл на месте
  • /^foo/! только выполните следующее действие на строках не ! начиная с фу ^foo
  • s/^/bar/ измените начало строки на bar  

вы используете синтаксис Perl-совместимого регулярного выражения (PCRE), который не поддерживается GNU sed. Вы должны переписать регулярное выражение в соответствии с SED Регулярные Выражения или вместо этого используйте perl.