按行就地查找和替换(linux)

时间:2016-05-04 18:34:32

标签: linux sed

我有一个看起来像这样的文本文件:

>ID1_ID2 other_stuff
more_other_stuff
>ID3_ID4 other_stuff
more_other_stuff

我想将其更改为:

>ID1_ID2;label=ID1 other_stuff
more_other_stuff
>ID3_ID4;label=ID3 other_stuff
more_other_stuff

也就是说,对于以>开头的每一行,添加;label=ID(在特定位置),其中ID>和第一个下划线之间的数字。所有ID都是整数。

我可以在Python中解决这个问题,但是有没有简单的方法可以使用sedawk或其他Unix命令行工具就地执行此操作?

2 个答案:

答案 0 :(得分:1)

使用GNU sed,您可以使用:

sed -r 's/^>(([0-9]+)_([0-9]+))( .*)/\1;label=\2\4/' yourfile

如果有效,您可以添加选项-i,bak

匹配

  • 表示>^>
  • 的行
  • 后跟两个序列数字
  • _分隔:(([0-9]+)_([0-9]+))
    • 整个序列被捕获到\1
    • 每个号码都会被捕获到\2\3
    • 该行的其余部分(( .*))被捕获到\4
  • 替换使用捕获的值来获得您想要的内容

答案 1 :(得分:0)

使用GNU sed:

$ sed -r 's/>([^_]+)\S+/&;label=\1/' file
>ID1_ID2;label=ID1 other_stuff
more_other_stuff
>ID3_ID4;label=ID3 other_stuff
more_other_stuff

在您进行测试后添加-i标记。