如何在Bash中替换任意长度的重复字符序列?
将连续重复的分隔符替换为单个字符
需要处理带已知分隔符的字符串,把出现一次或多次的相同字符序列(这里是*)替换成单个指定字符(比如_),无需假设重复序列的最大长度。
原有方案的问题
之前的做法是多次调用sed,逐个替换不同长度的*组合,必须提前预估最大重复长度,扩展性极差:
cat example_file.txt | sed 's/\*\*\*\*\*\*\*\*/_/g' | sed 's/\*\*\*\*\*\*\*/_/g' | sed 's/\*\*\*\*\*\*/_/g' | sed 's/\*\*\*\*/_/g' | sed 's/\*\*/_/g' | sed 's/\*/_/g' > clean_file.txt
解决方案:用正则匹配任意长度的重复序列
直接利用正则表达式匹配一个或多个连续的*,一次完成全局替换,无需考虑重复长度。
方法1:兼容所有sed版本的基础正则语法
sed 's/\*\+/_/g' example_file.txt > clean_file.txt
\*:转义后的星号,匹配单个*字符\+:匹配前面的字符(即*)一次或多次(基础正则中需转义+)g:全局替换一行内所有匹配的部分
方法2:启用扩展正则(适用于GNU sed等支持-E选项的版本)
sed -E 's/\*+/\_/g' example_file.txt > clean_file.txt
-E:启用扩展正则语法,此时+无需转义,直接表示“匹配前面字符一次或多次”
输入输出示例
输入文件example_file.txt内容:
>SH1111056.09FU|KC881085_refs|k__Fungi;p__Ascomycota;c__Sordariomycetes;o__Hypocreales;f__Clavicipitaceae;g__Neotyphodium;s__Neotyphodium_siegelii;|foliar_endophyte*litter_saprotroph*class1_clavicipitaceous_endophyte**leaf/fruit/seed**non-aquatic*arthropod-associated*filamentous_mycelium****** >SH1115797.09FU|UDB031565_refs|k__Fungi;p__Basidiomycota;c__Agaricomycetes;o__Hymenochaetales;f__Hymenochaetaceae;g__Fomitiporia;s__Fomitiporia_hippophaeicola;|plant_pathogen*wood_saprotroph**wood_pathogen*wood*white_rot*non-aquatic**filamentous_mycelium*polyporoid*poroid**** >SH0879139.09FU|KF945456|k__Viridiplantae;p__Anthophyta;c__Eudicotyledonae;o__Lamiales;f__Acanthaceae;g__Ruellia;s__Ruellia_brandbergensis;|ND************** >SH0991532.09FU|UDB07658019|k__Fungi;p__Ascomycota;c__Dothideomycetes;o__Venturiales;f__Venturiaceae;g__Sympodiella;s__Sympodiella_sp;|litter_saprotroph****leaf/fruit/seed**non-aquatic**filamentous_mycelium****** >SH0991546.09FU|UDB07657573|k__Fungi;p__Ascomycota;c__Dothideomycetes;o__Venturiales;f__Venturiaceae;g__Sympodiella;s__Sympodiella_sp;|litter_saprotroph****leaf/fruit/seed**non-aquatic**filamentous_mycelium******
处理后输出:
>SH1111056.09FU|KC881085_refs|k__Fungi;p__Ascomycota;c__Sordariomycetes;o__Hypocreales;f__Clavicipitaceae;g__Neotyphodium;s__Neotyphodium_siegelii;|foliar_endophyte_litter_saprotroph_class1_clavicipitaceous_endophyte_leaf/fruit/seed_non-aquatic_arthropod-associated_filamentous_mycelium_ >SH1115797.09FU|UDB031565_refs|k__Fungi;p__Basidiomycota;c__Agaricomycetes;o__Hymenochaetales;f__Hymenochaetaceae;g__Fomitiporia;s__Fomitiporia_hippophaeicola;|plant_pathogen_wood_saprotroph_wood_pathogen_wood_white_rot_non-aquatic_filamentous_mycelium_polyporoid_poroid_ >SH0879139.09FU|KF945456|k__Viridiplantae;p__Anthophyta;c__Eudicotyledonae;o__Lamiales;f__Acanthaceae;g__Ruellia;s__Ruellia_brandbergensis;|ND_ >SH0991532.09FU|UDB07658019|k__Fungi;p__Ascomycota;c__Dothideomycetes;o__Venturiales;f__Venturiaceae;g__Sympodiella;s__Sympodiella_sp;|litter_saprotroph_leaf/fruit/seed_non-aquatic_filamentous_mycelium_ >SH0991546.09FU|UDB07657573|k__Fungi;p__Ascomycota;c__Dothideomycetes;o__Venturiales;f__Venturiaceae;g__Sympodiella;s__Sympodiella_sp;|litter_saprotroph_leaf/fruit/seed_non-aquatic_filamentous_mycelium_
内容的提问来源于stack exchange,提问作者another_rando
相关产品推荐
相关产品推荐

