首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用tr替换多个集合?

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

Unix & Linux用户
提问于 2020-06-15 13:59:15
回答 3查看 8.8K关注 0票数 7

我希望使用tr将数字0-5替换为A,将数字6-9替换为B

我试着使用sed来完成这个任务:

代码语言:javascript
复制
sed 's/[0-4]/</; s/[6-9]/>/' 

但是,它只能工作一次,因此,例如,如果我编写123,它只会附带A23而不是AAA

EN

回答 3

Unix & Linux用户

发布于 2020-06-15 14:05:46

对于sed,您需要添加g,以便它将替换每一行中的所有事件:

代码语言:javascript
复制
sed 's/[0-4]/A/g;s/[5-9]/B/g'

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

代码语言:javascript
复制
tr '0-4' A | tr '6-9' B

或者显式地提供字符转换:

代码语言:javascript
复制
tr 0123456789 AAAAABBBBB

甚至:

代码语言:javascript
复制
tr 0-45-9 AAAAABBBBB

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

重复的Bs可以缩写(tr在必要时重复最后一个字符),范围可以合并:

代码语言:javascript
复制
tr 0123456789 AAAAAB
tr 0-9 AAAAAB

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

代码语言:javascript
复制
tr 0123456789 \
   AAAAABBBBB

或者,利用引用的范围与此场景中的扩展长度匹配的事实:

代码语言:javascript
复制
tr '0-4''5-9' \
   AAAAABBBBB

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

票数 9
EN

Unix & Linux用户

发布于 2020-06-15 14:05:49

在结尾处使用/g量词对所有字符应用全局替换。如果没有它,替换将在第一次匹配字符时结束,并将不会随后进行。

另一种方法是使用sed来音译可同时使用的GNU和POSIX字符(类似于tr)。

代码语言:javascript
复制
sed 'y/123456789/AAAAABBBB/'
票数 4
EN

Unix & Linux用户

发布于 2020-06-15 17:57:30

假设范围为0-4和5-9:

代码语言:javascript
复制
tr 0-9 AAAAAB

代码语言:javascript
复制
sed y_0123456789_AAAAABBBBB_
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/593035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档