【问题标题】:Sed replace with first characters in linesed 用行中的第一个字符替换
【发布时间】:2016-08-17 11:36:28
【问题描述】:

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

有没有办法“逃离逃生团”?

【问题讨论】:

    标签: bash sed


    【解决方案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 globally 的完整表达式。
    • ^(\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
    

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

    【讨论】:

      猜你喜欢
      • 2012-09-13
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多