65

这就是我正在做的(简化示例):

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

我试图把bar不以 . 开头的每一行放在前面foo。这是错误:

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

怎么了?

4

3 回答 3

164
sed -i '/^foo/! s/^/bar/' file.txt
  • -i就地更改文件
  • /^foo/!!仅对不以foo开头的行执行下一个操作 ^foo
  • s/^/bar/将行的开头更改为 bar  
于 2012-08-29T12:31:16.967 回答
67

据我所知sed,既不是向前看也不是向后看。切换到具有相似语法的更强大的语言,例如perl.

于 2012-08-29T10:40:22.477 回答
9

您使用 GNU sed 不支持的 perl 兼容正则表达式 (PCRE) 语法。您应该根据 SED正则表达式重写您的正则表达式perl改用它。

请注意,SED 没有前瞻功能,因此不支持您尝试使用的正则表达式功能。正如其他人所提到的,它可以在 SED 中使用其他功能来完成。

于 2012-08-29T11:39:47.627 回答