Sed替换为第一个字符

时间:2016-08-17 11:36:28

标签: bash sed

我有点卡在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

有没有办法逃脱逃脱组"?

1 个答案:

答案 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

由于您在替换部分中使用.*,因此它是按字面意思而不是正则表达式。