【问题标题】:replacing a string contained withing two strings with an incremental counter in bash用bash中的增量计数器替换两个字符串中包含的字符串
【发布时间】:2020-07-09 22:53:58
【问题描述】:

我正在尝试更改如下所示的文件:

>sample_A#Dakota
text
text
text
>text_2#Idao
text
text
text
>junk_1#Alabama
text
text
text
>example_4#Dakota
text
text
text
>example5#Honduras
text
text
text

到一个看起来像这样的文件:

>model_1#Dakota
text
text
text
>model_2#Idao
text
text
text
>model_3#Alabama
text
text
text
>model_4#Dakota
text
text
text
>model_5#Honduras
text
text
text

所以,我需要找到 > 和 # 之间的文本,并将其替换为“model”,后跟一个递增的数字。我找到了一些仅针对单独做这些事情的答案,但我无法将它们结合起来。我想使用 bash,使用 sed 或 awk 之类的单行答案。 我试过这个:

awk 'BEGIN { cntr = 0 } />/,/#/ { cntr++ ; print "model", cntr } !/>/,/#/ { print $0 }' infile

但我得到了这个:

model 1
text
text
text
model 2
>text_2#Idao
text
text
text
model 3
>junk_1#Alabama
text
text
text
model 4
>example_4#Dakota
text
text
text
model 5
>example5#Honduras
text
text
text

提前致谢, T

【问题讨论】:

  • /regexp1/,/regexp2/ 语法用于定义与这些正则表达式匹配的行组,而不是用于单行匹配.. 应改为 />.*#/

标签: text awk sed


【解决方案1】:
$ awk '/^>.*#/{sub(/^>[^#]+/, ">model_" ++c)} 1' ip.txt
>model_1#Dakota
text
text
text
>model_2#Idao
text
text
text
>model_3#Alabama
text
text
text
>model_4#Dakota
text
text
text
>model_5#Honduras
text
text
text
  • /^>.*#/ 如果行以> 开头并且行中有#
  • sub 功能有助于搜索和替换第一个匹配项
  • /^>[^#]+/ 匹配从> 开始直到# 字符之前的字符
  • ">model_" ++c 替换字符串
    • c 会在开始时为零(因为这是数字上下文),++c 会在递增后给出值,所以我们第一次得到1,下一次得到2 等等

【讨论】:

    【解决方案2】:
    $ awk 'sub(/^>[^#]+/,""){$0=">model1_" (++cnt) $0} 1' file
    >model1_1#Dakota
    text
    text
    text
    >model1_2#Idao
    text
    text
    text
    >model1_3#Alabama
    text
    text
    text
    >model1_4#Dakota
    text
    text
    text
    >model1_5#Honduras
    text
    text
    text
    

    【讨论】:

      【解决方案3】:

      您也可以尝试一下吗?

      awk 'match($0,/>.*#/){print ">model_"++count"#" substr($0,RSTART+RLENGTH);next} 1' Input_file
      

      【讨论】:

        【解决方案4】:
        awk '/^>/{$0=">model_" ++c "#" $3}1' FS='[>#]' file
        

        我使用># 作为字段分隔符。

        输出:

        >model_1#达科他州 文本 文本 文本 >model_2#伊道 文本 文本 文本 >model_3#阿拉巴马州 文本 文本 文本 >model_4#达科他州 文本 文本 文本 >model_5#洪都拉斯 文本 文本 文本

        【讨论】:

          【解决方案5】:

          这可能对你有用(GNU sed 和 shell):

          sed -E '/^>.*#/{x;s/.*/expr & + 1/e;x;G;s/^[^#]*(.*)\n(.*)/echo "model_\2\1"/e}' file
          

          对于以> 开头并包含# 的行,在保持空间 (HS) 中增加一个计数器,将 HS 附加到当前行并重新排列为所需的格式。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-30
            • 1970-01-01
            • 1970-01-01
            • 2020-10-12
            • 2019-09-10
            • 2019-05-29
            相关资源
            最近更新 更多