Linux中如何使用tr命令处理字符串?替换指定内容遇异常求助
解决tr命令替换字符串的问题
嗨,我来帮你理清楚这个问题——你用tr命令遇到的异常,其实是因为tr是按单个字符进行替换的工具,根本不支持字符串级别的替换,这就是为什么你的输出会变得乱七八糟!
为什么你的tr命令失效了?
你执行的命令是:
test="biological_process GO:0000001 mitochondrion inheritance is_a GO:0048308 organelle inheritance" echo $test | tr 'is_a' '\n'
这里的'is_a'被tr解析成了四个独立的字符:i、s、_、a,tr会把原字符串里的每一个这些字符都替换成换行符,所以才会出现b olog c l proce...这种拆碎单词的结果,完全不是你想要的替换整个is_a字符串的效果。
正确的解决方案:用sed或awk处理字符串替换
因为tr不支持字符串替换,我们需要用专门处理文本字符串/正则的工具,比如sed或者awk:
1. 用sed替换is_a为空(也就是删除它,达到你示例里的目标)
test="biological_process GO:0000001 mitochondrion inheritance is_a GO:0048308 organelle inheritance" echo "$test" | sed 's/is_a//'
执行后就会得到你想要的结果:
biological_process GO:0000001 mitochondrion inheritance GO:0048308 organelle inheritance
2. 如果你确实想把is_a替换成换行符(而不是删除)
用sed的话可以直接写:
echo "$test" | sed 's/is_a/\n/'
(注:如果是非GNU版本的sed,可能需要用printf '\n'来传入换行符,比如sed "s/is_a/$(printf '\n')/")
3. 用awk实现同样效果
删除is_a:
echo "$test" | awk '{sub(/is_a/, "")}1'
替换成换行符:
echo "$test" | awk '{sub(/is_a/, "\n")}1'
内容的提问来源于stack exchange,提问作者upendra
相关产品推荐
相关产品推荐

