Linux tr命令

参考资料

  1. 【 tr 】コマンド――テキストファイルの文字を置換する/削除する
  2. 【Linux】trコマンド使ってみた【trコマンド】


一. 基本语法

⏹用于对输入的文本进行字符转换或删除。它通常用来替换或删除字符,但只能对单个字符进行操作,不能处理正则表达式。

  • SET1:要替换或删除的字符集。

  • SET2

    • 将 SET1中的字符替换为 SET2 中的字符。若 SET2 省略,则默认删除 SET1 中的字符。
    • 💥注意:替换指的是字符的替换,不是汉字的替换。使用替换汉字的话,会造成乱码。
      建议使用更加强大的sed命令来替换汉字。
  • OPTION

    • -d:删除 SET1 中的字符,而不替换。
    • -s:替换多个重复出现的字符为单个字符。
    • -c:将 SET1 取反操作。
短选项长选项
-d–delete
-s–squeeze-repeats
-c–complement
tr [OPTION] SET1 [SET2]

二. 替换

2.1 匹配模式进行替换

⏹tr命令虽然不支持正则表达式进行替换,但是支持匹配模式替换字符。

$ echo "hello world" | tr 'a-z' 'A-Z'
HELLO WORLD
$ echo "12345你好" | tr '[1-3]' '*'
***45你好

$ echo "12345你好" | tr '1|3' '*'
*2*45你好

2.2 只支持字符的替换

⏹只支持字符的替换,替换汉字的话,会出现乱码问题

# 替换汉字,结果出现乱码问题
fengyehong@ubuntu:~$ echo "你好 世界" | tr "世界" "WORLD"
W��好 WORLDD

# 替换汉字建议使用更加强大的sed命令
fengyehong@ubuntu:~$ echo "你好 世界" | sed "s/世界/WORLD/"
你好 WORLD

三. 选项

3.1 -d 删除指定字符

⏹删除0-9的数字字符

fengyehong@ubuntu:~$ echo "hello 123 world" | tr -d '0-9'
hello  world

⏹删除\r字符,实现windows的CRLF换行符转换为linux的LF换行符

fengyehong@ubuntu:~$ cat info.txt
aaa
bbb
ccc
ddd

# 查看换行符
fengyehong@ubuntu:~$ file info.txt
info.txt: ASCII text, with CRLF line terminators

# 删除\r字符
fengyehong@ubuntu:~$ cat info.txt | tr -d '\r' > info2.txt

fengyehong@ubuntu:~$ cat info2.txt
aaa
bbb
ccc
ddd
fengyehong@ubuntu:~$ file info2.txt
info2.txt: ASCII text

⏹echo命令指定后默认会添加一个换行符

  • 可以通过-n选项来避免换行符的添加
  • 还可以通过tr -d '\n'删除换行符
fengyehong@ubuntu:~$ echo "你好 世界"
你好 世界

fengyehong@ubuntu:~$ echo "你好 世界" | tr -d '\n'
你好 世界fengyehong@ubuntu:~$

fengyehong@ubuntu:~$ echo -n "你好 世界"
你好 世界fengyehong@ubuntu:~$

3.2 -s 替换多个重复出现的字符为单个字符

⏹替换多个空格为一个空格

fengyehong@ubuntu:~$ echo "hello   world"
hello   world
fengyehong@ubuntu:~$ echo "hello   world" | tr -s ' '
hello world

tr -s '\n':删除多个连续的换行符

fengyehong@ubuntu:~$ file info.txt
info.txt: ASCII text
fengyehong@ubuntu:~$
fengyehong@ubuntu:~$ cat info.txt
aaa

bbb

ccc

ddd

fengyehong@ubuntu:~$ cat info.txt | tr -s '\n'
aaa
bbb
ccc
ddd

3.3 -c 取反

⏹删除1-5之外的所有字符

fengyehong@ubuntu:~$ echo "123456789FFFKK"
123456789FFFKK
fengyehong@ubuntu:~$
fengyehong@ubuntu:~$ echo "123456789FFFKK" | tr -dc '[1-5]'
12345fengyehong@ubuntu:~$
# 删除1到5之外的所有字符(换行符也被删除了)之后,通过printf进行打印的时候,再加上换行符
fengyehong@ubuntu:~$ echo "123456789FFFKK" | tr -dc '[1-5]' | xargs printf "%s\n"
12345

四. 配合/dev/urandom随机生成数据

  • -d:删除字符

  • -c:取反,所以 保留字母和数字,删除其他字符

这样 /dev/urandom 生成的随机数据就只包含字母和数字了。

apluser@ubuntu24-01:~$ echo $(tr -dc 'a-zA-Z0-9' </dev/urandom | head -c 8)
bFzMtyOR
apluser@ubuntu24-01:~$ echo $(tr -dc 'a-zA-Z0-9' </dev/urandom | head -c 8)
MYwc5WzJ
apluser@ubuntu24-01:~$ echo $(tr -dc 'a-zA-Z0-9' </dev/urandom | head -c 8)
7quFGVAB
apluser@ubuntu24-01:~$ echo $(tr -dc 'a-zA-Z0-9' </dev/urandom | head -c 8)
P17bFGE9
### Linux `tr` 命令使用教程 #### 一、基本概念 `tr` 是一种用于转换或删除字符的命令工具,在 Bash 中应用广泛。该命令并不复杂却十分有用,适用于多种场景下的字符处理工作[^3]。 #### 二、基础语法结构 标准形式如下所示: ```shell tr [选项] SET1 [SET2] ``` 其中,`SET1` 表示源字符集合;而当指定了第二个字符集 `SET2` 后,则会将来自输入流里的每一个属于 `SET1` 的成员替换成对应的 `SET2` 成员[^1]。 #### 三、具体功能展示 ##### (一)字符翻译 可以实现大小写字母之间的相互转换: ```shell echo "HELLO WORLD" | tr '[:upper:]' '[:lower:]' ``` 上述指令将会把所有的大写英文字母转变为相应的小写字母版本。 ##### (二)字符删除 通过指定特定的目标字符来移除它们: ```shell echo "this is a test." | tr -d ' ' ``` 这里 `-d` 参数指示 `tr` 移除所有空格字符[^5]。 ##### (三)压缩重复项 利用 `-s` 开关能够有效地去除连续出现多次相同类型的符号: ```shell echo "hello...world!!!" | tr -s '.!' ``` 这条语句的作用在于仅保留每种标点符号的一次实例。 ##### (四)取反操作 借助于 `-c` 标志位可选取给定范围之外的所有其他ASCII码表内的元素作为待处理对象: ```shell echo "abcXYZ123" | tr -cd 'a-z' ``` 此表达式的含义是从原始字符串里筛选并输出全部位于小写字母区间之中的成分[^4]。 需要注意的是,尽管 `tr` 功能强大且易于掌握,但由于其局限性——即只支持单一字符级别的映射关系建立——所以在面对更为精细复杂的文本编辑需求时往往显得力不从心。此时推荐考虑采用像 `sed` 或者 `awk` 这样的高级脚本语言来进行替代作业[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值