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命令吗?
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的命令开关下看到
这可能对你有用(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。
删除所有脚手架换行符。