带竖线的 sed?
sed with vertical bar?
我有一个列表
>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 吗?
尝试:
sed 's/ANARCI[^|]*\|//g'
不匹配 |
使用sed
$ sed 's/[A-Z][^|]*|//' input_file
>pdb|7EPU|A
>pdb|7EVY|E
>pdb|7F2O|S
>pdb|7F4F|S
>pdb|7F8W|D
第一个解决方案:使用您显示的示例,请尝试遵循 sed
代码。
sed -E 's/(.*)ANARCI[^|]*\|(.*)//' Input_file
说明: 为以上 sed
代码添加详细说明。
- 使用
sed
的 -E
选项为程序启用 ERE(扩展正则表达式)。
- 然后使用
sed
将匹配模式存储到临时缓冲存储器(称为捕获组)中的能力,通过它我们可以在替换时使用捕获的值。
- 在这里创建 2 个捕获组,第一个包含 ANARCI 字符串之前的所有内容,第二个捕获组包含第一个管道之后的所有内容(从 ANARCI 匹配到第一个管道)以获取第一个管道之后的其余部分。
- 在用第一个和第二个捕获组执行替换替换行时。
第二个解决方案: 您也可以使用 awk
来完成此任务,使用 match
函数 awk
。简单的解释是,使用 awk
的 match
函数并仅匹配输出中不需要的部分,同时打印值打印除匹配部分(不需要)之外的所有其他内容。
awk 'match([=11=],/ANARCI[^|]*/){print substr([=11=],1,RSTART-1) substr([=11=],RSTART+RLENGTH+1)}' Input_file
第三个解决方案: 在 awk
中添加 1 个解决方案,其中将字段分隔符设置为:来自字符串 ANARCI
直到第一次出现管道。然后在主要 awk
程序中打印第一个和最后一个字段,所需的值根据示例显示。
awk -v FS="ANARCI[^\\|]*\\|" '{print $NF}' Input_file
如果您想从第一个竖线 | 的 ANARCI 中删除,试试这个:
sed 's/ANARCI[^|]*\|//g'
或
sed 's/ANARCI[^|]*\|(.*)//'
我有一个列表
>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 吗?
尝试:
sed 's/ANARCI[^|]*\|//g'
不匹配 |
使用sed
$ sed 's/[A-Z][^|]*|//' input_file
>pdb|7EPU|A
>pdb|7EVY|E
>pdb|7F2O|S
>pdb|7F4F|S
>pdb|7F8W|D
第一个解决方案:使用您显示的示例,请尝试遵循 sed
代码。
sed -E 's/(.*)ANARCI[^|]*\|(.*)//' Input_file
说明: 为以上 sed
代码添加详细说明。
- 使用
sed
的-E
选项为程序启用 ERE(扩展正则表达式)。 - 然后使用
sed
将匹配模式存储到临时缓冲存储器(称为捕获组)中的能力,通过它我们可以在替换时使用捕获的值。 - 在这里创建 2 个捕获组,第一个包含 ANARCI 字符串之前的所有内容,第二个捕获组包含第一个管道之后的所有内容(从 ANARCI 匹配到第一个管道)以获取第一个管道之后的其余部分。
- 在用第一个和第二个捕获组执行替换替换行时。
第二个解决方案: 您也可以使用 awk
来完成此任务,使用 match
函数 awk
。简单的解释是,使用 awk
的 match
函数并仅匹配输出中不需要的部分,同时打印值打印除匹配部分(不需要)之外的所有其他内容。
awk 'match([=11=],/ANARCI[^|]*/){print substr([=11=],1,RSTART-1) substr([=11=],RSTART+RLENGTH+1)}' Input_file
第三个解决方案: 在 awk
中添加 1 个解决方案,其中将字段分隔符设置为:来自字符串 ANARCI
直到第一次出现管道。然后在主要 awk
程序中打印第一个和最后一个字段,所需的值根据示例显示。
awk -v FS="ANARCI[^\\|]*\\|" '{print $NF}' Input_file
如果您想从第一个竖线 | 的 ANARCI 中删除,试试这个:
sed 's/ANARCI[^|]*\|//g'
或
sed 's/ANARCI[^|]*\|(.*)//'