如何用tr或sed交换文件中的/1与/2值?
如何交换文件中的/1和/2?
为什么你之前的方法无效?
- tr命令:这是字符级替换工具,不是字符串替换。
tr /1 /2的作用是保留字符/,将字符1替换成2,所以所有/1会变成/2,但原有的/2不受影响;两次tr串联的话,第一次把1转成2,第二次又把2转成1,最终所有/1和/2都会变成/1。 - 直接两次sed替换:你写的命令里分隔符
/没有转义(正确写法应为s/\/1/\/2/g),但即使转义正确,先把/1换成/2,再把/2换成/1,会导致刚替换出来的/2又被转成/1,最终所有目标字符串都变成/1,无法完成交换。
正确的解决方法
方法1:sed + 临时占位符
用一个文件中不存在的临时标记作为中转,避免替换冲突:
# 用#作为分隔符,无需转义/,更简洁 sed -i -e 's#/1#TEMP_MARKER#g' -e 's#/2#/1#g' -e 's#TEMP_MARKER#/2#g' file.txt
步骤:
- 先把所有
/1替换成临时标记TEMP_MARKER(确保这个标记在文件中不存在) - 把所有
/2替换成/1 - 最后把临时标记替换成
/2,完成交换
方法2:awk处理
awk的gsub函数可以全局替换字符串,同样用临时标记中转:
# 输出到新文件 awk '{gsub(/\/1/, "TEMP"); gsub(/\/2/, "/1"); gsub(/TEMP/, "/2")}1' file.txt > out.txt # GNU awk支持直接修改原文件 awk -i inplace '{gsub(/\/1/, "TEMP"); gsub(/\/2/, "/1"); gsub(/TEMP/, "/2")}1' file.txt
方法3:Perl一行命令
利用Perl的正则替换逻辑,直接判断匹配内容并交换:
perl -i -pe 's/(\/1|\/2)/$1 eq "\/1" ? "\/2" : "\/1"/ge' file.txt
解释:匹配/1或/2,通过代码逻辑判断:如果匹配的是/1就换成/2,否则换成/1,ge参数表示执行替换中的代码逻辑。
内容的提问来源于stack exchange,提问作者SaltedPork
相关产品推荐
相关产品推荐

