使用前瞻正则表达式替换文本

sha*_*nuo 2 regex perl awk grep sed

我正在尝试修改文本文件的几行。

# cat example.txt
tested
tests
testing
Run Code Online (Sandbox Code Playgroud)

如果单词“test”后面没有跟“ed”或“s”,则将其更改为单词“work”。以下表达式按预期工作:

test(?!ed|s)
Run Code Online (Sandbox Code Playgroud)

但它在 sed 中不起作用,就像这样......

# sed -r 's/test\(?!ed\|s\)/work/g' example.txt
tested
tests
testing
Run Code Online (Sandbox Code Playgroud)

预期输出是:

tested
tests
working
Run Code Online (Sandbox Code Playgroud)

我猜 sed 不支持前瞻或回顾。还有其他简单的linux命令吗?

zdi*_*dim 7

perl -pe's/test(?!ed|s)/work/g' filename
Run Code Online (Sandbox Code Playgroud)

对于 Unicode(非 ASCII)文本,我们需要启用对其的支持

perl -Mutf8 -CSAD -pe'...' filename
Run Code Online (Sandbox Code Playgroud)

如果源代码中存在非 ASCII 字符,则需要使用 utf8 pragma,而其他标志可以在perlrun命令开关下看到


pot*_*ong 5

这可能对你有用(GNU sed):

sed -E 's/\<(test)(ed|s)?\>/\1\n\2/g;s/\<test(\S+)/work\1/g;s/\n//g' file
Run Code Online (Sandbox Code Playgroud)

如果单词可以选择以定义的结尾结尾,请在该单词与其允许的结尾之间插入换行符。

如果相同的单词不以换行符结尾,则将该单词替换为work

删除所有脚手架换行符。