这是我正在做的事情(简化示例):
gsed -i -E 's/^(?!foo)(.*)$/bar\1/' file.txt
我正在尝试在每行不以foo
开头的行前面放置bar
. 这是错误信息:
gsed: -e expression #1, char 22: Invalid preceding regular expression
有什么问题吗?
这是我正在做的事情(简化示例):
gsed -i -E 's/^(?!foo)(.*)$/bar\1/' file.txt
我正在尝试在每行不以foo
开头的行前面放置bar
. 这是错误信息:
gsed: -e expression #1, char 22: Invalid preceding regular expression
有什么问题吗?
sed -i '/^foo/! s/^/bar/' file.txt
-i
意为原地修改文件/^foo/!
只对不以 foo 开头的行进行下一步操作s/^/bar/
将行首替换为 bar。^foo
这样的锚定表达式来说,这是可行的,但不幸的是并不能扩展到模式中任何位置的负向先行断言。 - tripleee's/(?!foo)baz/bar/'
=> '/foobaz/! s/baz/bar/'
。也许巧妙地应用这种方法可以扩展到包含“foobaz baz”等内容的行。 - Nathan Vancesed
既没有向前查找也没有向后查找。建议转用更加强大、语法类似的编程语言,例如perl
。sed
转换成 perl
的参考代码:sed 's/before/after/g' /my/file
=> cat /my/file | perl -ne 's/before/after/g; print;'
- Batandwaperl -pi -e 's/before/after/g' /my/file
即可。 - ypidsed
有提供多个编辑序列的能力,就像kkeller的回答所说。 - Cirelli94您使用的是Perl兼容正则表达式(PCRE)语法,而GNU sed不支持这种语法。您应该按照SED 正则表达式的规则重写您的正则表达式或改用perl
。
请注意,SED没有前瞻,并且因此不支持您尝试使用的正则表达式特性。可以使用其他功能在SED中完成,就像其他人已经提到的那样。