如何使用tr替换多个集合?

pim*_*man 5 sed text-processing tr

我想用tr替换数字0-5A和数字6-9B

我试过sed这样做:

sed 's/[0-4]/</; s/[6-9]/>/' 
Run Code Online (Sandbox Code Playgroud)

它只工作一次,例如,如果我写123它只会附带A23而不是AAA.

Ste*_*itt 8

使用sed,您需要添加,g以便它替换每一行上出现的所有内容:

sed 's/[0-4]/A/g;s/[5-9]/B/g'
Run Code Online (Sandbox Code Playgroud)

使用tr,您可以链接两个trs:

tr '0-4' A | tr '6-9' B
Run Code Online (Sandbox Code Playgroud)

或明确提供字符转换:

tr 0123456789 AAAAABBBBB
Run Code Online (Sandbox Code Playgroud)

甚至:

tr 0-45-9 AAAAABBBBB
Run Code Online (Sandbox Code Playgroud)

(但我发现后者不太可读,因为 1-1 映射不是立即可见的)。

重复的Bs 可以缩写(tr根据需要重复最后一个字符),并且可以合并范围:

tr 0123456789 AAAAAB
tr 0-9 AAAAAB
Run Code Online (Sandbox Code Playgroud)

对于更复杂的替换,拆分命令可以帮助使其目的更加明显:

tr 0123456789 \
   AAAAABBBBB
Run Code Online (Sandbox Code Playgroud)

或者,利用引用范围与这种情况下的扩展长度相匹配的事实:

tr '0-4''5-9' \
   AAAAABBBBB
Run Code Online (Sandbox Code Playgroud)

我假设范围拆分为 0-4 和 5-9,以便均匀拆分,如sed示例的第一个命令所示。可以根据需要调整范围。