如何使用 gnu sed 替换除一个单词以外的所有单词?
How to use gnu sed to replace all but one word?
我有这段文字 (the_file.txt):
one two three four
five six seven eight
nine ten eleven twelve
thirteen fourteen fifteen sixteen
我想使用 gnu sed 将每个单词替换为 "Z",单词 "six" 除外。我是这样做的:
sed 's/\<\([^s]\|.[^i]\|.[^ ][^x]\|[^ ]\{4\}\)[^ ]*/Z/g' the_file.txt
有效:
Z Z Z Z
Z six Z Z
Z Z Z Z
Z Z Z Z
我的问题是:有更简单的方法吗?因为如果我想保留两三个词,正则表达式就会变得非常难看。
我知道使用其他工具(例如 awk)会更容易,但我有兴趣提高我的 sed 能力,可能会使用一些脚本。
谢谢。
以下可能更容易维护:
sed 's/\(six\)\|\([^ ]\+\)/Z/g;s/sixZ/six/g'
它首先将所有内容替换为 Z
,但 six
除外,后者被 sixZ
替换,然后由第二次替换修复。
对于多个单词:
$ sed -E 's/\<(six|one|eleven)\>/\n&/g; s/(^| )\S+/Z/g; s/\n//g' file
one Z Z Z
Z six Z Z
Z Z eleven Z
Z Z Z Z
上面在每个目标词之前放置了一个换行符,然后替换了以空白字符开头或输入字符串开头的每个非空格序列(即不是我们的目标词,因为它们现在以换行符开头)使用 Z 然后删除在第一步中添加的换行符。
我有这段文字 (the_file.txt):
one two three four
five six seven eight
nine ten eleven twelve
thirteen fourteen fifteen sixteen
我想使用 gnu sed 将每个单词替换为 "Z",单词 "six" 除外。我是这样做的:
sed 's/\<\([^s]\|.[^i]\|.[^ ][^x]\|[^ ]\{4\}\)[^ ]*/Z/g' the_file.txt
有效:
Z Z Z Z
Z six Z Z
Z Z Z Z
Z Z Z Z
我的问题是:有更简单的方法吗?因为如果我想保留两三个词,正则表达式就会变得非常难看。
我知道使用其他工具(例如 awk)会更容易,但我有兴趣提高我的 sed 能力,可能会使用一些脚本。
谢谢。
以下可能更容易维护:
sed 's/\(six\)\|\([^ ]\+\)/Z/g;s/sixZ/six/g'
它首先将所有内容替换为 Z
,但 six
除外,后者被 sixZ
替换,然后由第二次替换修复。
对于多个单词:
$ sed -E 's/\<(six|one|eleven)\>/\n&/g; s/(^| )\S+/Z/g; s/\n//g' file
one Z Z Z
Z six Z Z
Z Z eleven Z
Z Z Z Z
上面在每个目标词之前放置了一个换行符,然后替换了以空白字符开头或输入字符串开头的每个非空格序列(即不是我们的目标词,因为它们现在以换行符开头)使用 Z 然后删除在第一步中添加的换行符。