我有点卡在sed替换问题上。我有一个制表符分隔文件,看起来像这样:
stuff1 \t names names names
stuff2 \t \t names names names
stuff3 \t \t names names names
stuff4 \t names names names
我想做的是以某种方式替换双标签,它会在它们之间插入第一个单词。像这样:
stuff2 \t stuff2 \t names names names
stuff3 \t stuff3 \t names names names
我试过的是
sed 's/\t\t/\t(.*\t\t\)\t/'
但是当我尝试用转义组替换它时,它会从字面上理解并改变每次出现的
\t\t
到
\t(.*\t\t\)\t
有没有办法逃脱逃脱组"?
答案 0 :(得分:1)
就像这样匹配它们:
$ sed -r 's/^(\S+)\t\t/\1\t\1\t/g' file
stuff1 names names names
stuff2 stuff2 names names names
stuff3 stuff3 names names names
stuff4 names names names
这是:
s/find/replacement/g
find
的完整表达式,并将其替换为replacement
g
。{/ li>
^(\S+)\t\t
[^\t]*
)。然后,匹配两个标签。\1\t\1\t
-r
sed
标记用于扩展正则表达式,允许您仅使用(...)
而不是\(...\)
来捕获组。顺便说一下,对我来说,你的命令输出是:
$ sed 's/\t\t/\t(.*\t\t\)\t/' file
stuff1 names names names
stuff2 (.* ) names names names
stuff3 (.* ) names names names
stuff4 names names names
由于您在替换部分中使用.*
,因此它是按字面意思而不是正则表达式。