【问题标题】:sed with vertical bar?sed 带竖线?
【发布时间】:2022-01-08 14:00:52
【问题描述】:

我有一个清单

>ANARCI-HMM_human_167.7|pdb|7EPU|A
>ANARCI-HMM_alpaca_173.7|pdb|7EVY|E
>ANARCI-HMM_alpaca_172.8|pdb|7F2O|S
>ANARCI-HMM_alpaca_171.8|pdb|7F4F|S
>ANARCI-HMM_alpaca_173.6|pdb|7F8W|D

我想从ANARCI 删除到第一个竖线|

期待

>pdb|7EPU|A
>pdb|7EVY|E
>pdb|7F2O|S
>pdb|7F4F|S
>pdb|7F8W|D

我试过了

sed 's/ANARCI.*\|//g'

但没用。

你知道在这种情况下如何 sed 吗?

【问题讨论】:

  • 为什么不使用awk

标签: sed


【解决方案1】:

第一种解决方案:使用您显示的示例,请尝试遵循sed 代码。

sed -E 's/(.*)ANARCI[^|]*\|(.*)/\1\2/' Input_file

说明:为上述sed代码添加详细说明。

  • 使用sed-E 选项为程序启用ERE(扩展正则表达式)。
  • 然后使用sed 将匹配模式存储到临时缓冲存储器(称为捕获组)中的能力,我们可以在替换时利用捕获的值。
  • 在此处创建 2 个捕获组,第一个捕获组在 ANARCI 字符串之前包含所有内容,第二个捕获组包含第一个管道之后的所有内容(从 ANARCI 到第一个管道匹配)以获取第一个管道之后的其余部分。
  • 在使用第一个和第二个捕获组执行替换替换行时。


第二个解决方案: 你也可以使用awk 来完成这个任务,使用awkmatch 函数。简单的解释是,使用awkmatch 函数并仅匹配输出中不需要的部分,同时打印除匹配部分(不是必需的)之外的其他所有内容的值。

awk 'match($0,/ANARCI[^|]*/){print substr($0,1,RSTART-1) substr($0,RSTART+RLENGTH+1)}' Input_file


第三种解决方案:awk 中添加 1 个解决方案,其中将字段分隔符设置为:从字符串 ANARCI 到第一次出现管道。然后在主awk 程序中打印第一个和最后一个字段,根据示例显示所需的值。

awk -v FS="ANARCI[^\\\\|]*\\\\|" '{print $1 $NF}' Input_file

【讨论】:

  • 无需将 sed 与 GNU ERE 正则表达式一起使用,因为 GNU BRE 正则表达式已经具有相同的功能(您只需要转义元字符)。对于 POSIX 合规性,请注意仅在 BRE 模式下支持反向引用。
【解决方案2】:

如果你想从 ANARCI 中删除第一个竖线 |,试试这个:

sed 's/ANARCI[^|]*\|//g'

sed 's/ANARCI[^|]*\|(.*)/\1\2/'

【讨论】:

    【解决方案3】:

    使用sed

    $ sed 's/[A-Z][^|]*|//' input_file
    >pdb|7EPU|A
    >pdb|7EVY|E
    >pdb|7F2O|S
    >pdb|7F4F|S
    >pdb|7F8W|D
    

    【讨论】:

    • 这与您的示例中的ANARCI 不匹配,而是任何以大写开头的文本
    【解决方案4】:

    试试:

    sed 's/ANARCI[^|]*\|//g'
    

    不匹配|

    【讨论】:

    • 使用 GNU BRE,您无需转义 | 即可获得文字。另外,在这种情况下,不需要使用g
    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2013-03-18
    相关资源
    最近更新 更多