You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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. 先把所有/1替换成临时标记TEMP_MARKER(确保这个标记在文件中不存在)
  2. 把所有/2替换成/1
  3. 最后把临时标记替换成/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:35:24