如何使用gnu sed替换除一个单词之外的所有单词?

时间:2017-09-30 20:56:33

标签: regex sed gnu

我有这个文本(the_file.txt):

one two three four
five six seven eight
nine ten eleven twelve
thirteen fourteen fifteen sixteen

我想用" Z"替换每个单词,除了单词" six",使用gnu sed。我是这样做的:

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能力,可能会使用一些脚本。

感谢。

2 个答案:

答案 0 :(得分:1)

对于多个单词:

$ sed -E 's/\<(six|one|eleven)\>/\n&/g; s/(^| )\S+/\1Z/g; s/\n//g' file
one Z Z Z
Z six Z Z
Z Z eleven Z
Z Z Z Z

上面在每个目标词之前放置一个换行符然后替换每个前面有空格的非空格序列或输入字符串的开头(即不是我们的目标词,因为它们现在以换行符开头), Z然后删除第一步中添加的换行符。

答案 1 :(得分:0)

以下内容可能更容易维护:

sed 's/\(six\)\|\([^ ]\+\)/\1Z/g;s/sixZ/six/g'

它首先将Z替换为six,但sixZ替换为Select ID, DateCome, UserName, Min(TimeCom) As TimeCome, Max(TimeCom) As TimeLeave From YourTable Group By ID, DateCome, UserName ,然后由import matplotlib.colors as colors def get_named_color(hex): return colors.cnames.keys()[colors.cnames.values().index(hex.upper())] 替换,然后由第二次替换修复。