【问题标题】:replace text between two tabs - sed替换两个选项卡之间的文本 - sed
【发布时间】:2016-08-16 02:33:38
【问题描述】:

我有以下输入文件:

text1 text2 text3 text4
abc1 abc2 abc3 abc4

我正在尝试在两个选项卡之间找到第二个字符串(例如 text2、abc2)并将其替换为另一个单词。

我试过了

sed s'/\t*\t/sample/1'

但它只删除选项卡而不替换单词。

感谢您的帮助!

【问题讨论】:

  • 欢迎来到本站!查看tour 了解更多信息(和徽章:))。请为您认为有用的任何答案投票,并在您最终使用的答案上打勾以将其标记为已接受的答案。

标签: linux unix ubuntu awk sed


【解决方案1】:

我建议在这里使用 awk:

awk 'BEGIN { FS = OFS = "\t" } { $2 = "sample" } 1' file

将输入和输出字段分隔符设置为选项卡并更改第二个字段。末尾的 1 始终为 true,因此 awk 执行默认操作,{ print }

【讨论】:

  • 伟大的思想相通 --- 相隔仅 13 秒 :)
  • 或者,awk -v OFS='\t' '$2="sample"'
  • 我最终使用了这个选项,因为它让我可以更实际地切换到其他列。非常感谢!!
  • @karakfa 它非常紧凑,但我真的不喜欢依赖任务的 RHS 是“真实的”。这会破坏""0 甚至"0"...我猜输入字段分隔符不需要更改,但这可以处理字段内的空格。
【解决方案2】:

使用这个sed

sed 's/\t[^\t]*\t/\tsample\t/'

【讨论】:

  • 是的。 OP 可能将 * 操作符误解为 shell-globbing 操作符——即“匹配任何东西”——而不是它在(sed 或其他)正则表达式中的实际含义。 OP 的原始模式\t*\t 的意思是“匹配零个或多个制表符后跟一个制表符”,因此确实只会删除它所涉及的第一个制表符序列。
  • sat,这适用于四列,但如果有第五列,则替换第二列和第四列。
【解决方案3】:

gawk 中的另一种选择,因为您标记了 awk ---

 gawk -- 'BEGIN {FS="\t"; OFS="\t"} {$2="sample"; print}'

例如,

 echo -e 'a\tb\tc\td' | gawk -- 'BEGIN {FS="\t"; OFS="\t"} {$2="sample"; print}'

打印

a    sample  c      d

FS 在制表符处中断输入,OFS 使用制表符分隔输出字段,$2="sample" 仅更改第二个字段,其余字段保持不变。

【讨论】:

  • 仅供参考,这与 gawk 无关,它适用于任何 awk。
【解决方案4】:

试试这个

 sed -e 's/\([a-zA-Z0-9]*\) \([a-zA-Z0-9]*\) \([a-zA-Z0-9]*\) \([a-zA-Z0-9]*\)/\1 sample \2 \3 \4/'

【讨论】:

    【解决方案5】:

    在 GNU sed v4.2.2 中,我必须使用 -r

    sed -r 's/^([^\t]*\t)[^\t]*/\1sample/'
    

    ^([^\t]*\t) 是第一个字段和第一个选项卡,[^\t]* 是第二个字段的文本。 \1 恢复第一个字段,sample 是你想要的任何东西:)。

    例如,

    echo -e 'a\tb\tc\td' | sed -r 's/^([^\t]*\t)[^\t]*/\1sample/'
    

    打印

    a       sample  c       d
    

    这也适用于四列以外的其他列。例如

    $ echo -e 'a\tb\tc' | sed -r 's/^([^\t]*\t)[^\t]*/\1sample/'
    a       sample  c
    
    $ echo -e 'a\tb\tc\td\te' | sed -r 's/^([^\t]*\t)[^\t]*/\1sample/'
    a       sample  c       d       e
    

    【讨论】:

      猜你喜欢
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      相关资源
      最近更新 更多