Linux命令之字符替换压缩删除tr

概述

tr 命令可以将字符进行替换、压缩、删除,即可以将一组字符转换成另外一组字符。tr 的全称是 transform

在这里插入图片描述
tr 他只能从标准输入中读取数据,因此,tr 要么将输入文件重定向到标准输入,要么从管道读入数据。注意:tr 类似于 sed 命令,但是比 sed 简单,所以 tr 能实现的功能,sed 都能实现。

注:tr 命令可以将一组大写字母转换成小写字母;删除字符串中的指定字符;压缩多个重复字符为一个。该命令在脚本中也挺常用的。

语法

该命令的语法如下:

tr [选项] [字符集合1] [字符集合2]

'A-Z’'a-z ' 都是集合。我们可以按照需要追加字符或字符类来构造自己定制的集合。'ABD-} 'aA.,a-ce-x 以及 'a-c0-9' 等均是合法的集合。定义集合也很简单,不需要去书写一长串连续的字符序列,相反,我们可以使用 “起始字符-终止字符” 这种格式。这种写法也可以和其他宇符或字符类结合使用。如果 “起始字符-终止字符” 不是一个连续的字符序列,那么它就会被视为一个包含了三个元素的集合(“起始字符-终止字符”)。你可以使用像 '\t''\n' 这种特殊字符,也可以使用其他 ASCII 字符。

该命令支持的选项有:

选项说明
-c选定字符串1中字符集的补集,即反选字符串1的补集
-d删除字符串1中出现的所有字符
-s删除连续重复的字符成指定的单个字符

字符集合支持的范围如下:

字符集合说明
\NNN 八进制值的字符 NNN
\\ 反斜杠
\a 铃声
\b 退格键
\f 走行换页
\n 新行
\r 回车键
\t 制表符
\v 水平制表符
CHAR1-CHAR2字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。如 a-z
[CHAR*] 这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止
[CHAR*REPEAT]这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始)
[:alnum:] 所有字母字符与数字
[:alpha:] 所有字母字符
[:blank:] 所有水平空格
[:cntrl:] 所有控制字符s
[:digit:] 所有数字
[:graph:] 所有可打印的字符(不包含空格符)
[:lower:] 所有小写字母
[:print:] 所有可打印的字符(包含空格符)
[:punct:] 所有标点字符
[:space:] 所有水平与垂直空格符
[:upper:] 所有大写字母
[:xdigit:] 所有 16 进位制的数字
[=CHAR=] 所有符合指定的字符

其实常用的字符范围如下:

字符范围说明
[a-z]所有的小写字母
[A-Z]所有的大写字母
[0-9]所有的数字
O*n表示字符 O 重复出现指定次数 n。因此 [O*2] 匹配 OO 的字符串

使用

替换字符串中的字符

我们可以将指定字符串中的字符替换成某个字符串中对应的字符,可以替换字符和文件中的指定字符。语法格式如下:

# 语法
# 替换字符串
echo 字符串 | tr 原字符串 新字符串
# 替换文件中的字符串
cat 指定文件 | tr 原字符串 新字符串
tr 原字符串 新字符串 < 指定文件

# 示例,替换字符串中的字符
echo "hello world" | tr "hello" "xyzmn"
echo "hello world" | tr "hello" "xyz"
cat test.txt | tr "a" "x"
tr "l" "L" < test.txt

在这里插入图片描述

注意:

  • 并不是用 "xyzmn" 替换原字符串 "hello",而是将所有出现的 h 字符替换成 x 字符;将所有出现的 e 字符替换成 y 字符;将所有出现的 l 字符替换成 z 字符;将所有出现的 l 字符替换成 m 字符,如果出现同样的则是后面的字符进行替换;将所有出现的 o 字符替换成 n 字符。
  • 字符串 1 中的字符个数与字符串 2 中的字符个数最好一一对应。如果两个字符集的长度不相等,那么 字符串2 会不断重复其最后一个字符,直到长度与 字符串1 相同。如果 字符串2 的长度大于 字符串1,那么在 字符串2 中超出 字符串1 长度的那部分字符则全部被忽略。

转换大小写

可以对字母大小写进行转换,由小写字母转换成大写字母,或由大写字母转换成小写字母。语法格式如下:

# 语法
# 将所有的小写字母转换成大写字母
echo 字符串 | tr [a-z] [A-Z]
# 将所有的大写字母转换成小写字母
echo 字符串 | tr [A-Z] [a-z]
# 替换文件中的字符串
# 将文件中的将所有的小写字母转换成大写字母
cat 指定文件 | tr [a-z] [A-Z]
tr [a-z] [A-Z] < 指定文件
# 将文件中的将所有的大写字母转换成小写字母
cat 指定文件 | tr [A-Z] [a-z]
tr [A-Z] [a-z] < 指定文件

# 示例,替换字符串中的字符
echo "hello world" | tr [a-z] [A-Z]
echo "HELLO WORLD" | tr [A-Z] [a-z]
cat test.txt | tr [a-z] [A-Z]
tr [a-z] [A-Z] < test.txt
cat test.txt | tr [A-Z] [a-z]
tr [A-Z] [a-z] < test.txt

在这里插入图片描述

删除字符集合中出现过的所有字符

如果要删除指定字符集合中出现过的所有字符,那么可以使用 -d 选项。语法命令格式如下:

# 语法
# 删除字符串中的某个字符
echo 字符串 | tr -d 指定字符
# 删除字符串中字符集合中出现的所有字符
echo 字符串 | tr -d 指定字符集合
# 删除文件中所有出现的指定字符
cat 指定文件路径 | tr -d 指定字符
tr -d 指定字符 < 指定文件路径
# 删除文件中所有出现的指定字符集合
cat 指定文件路径 | tr -d 指定字符集合
tr -d 指定字符集合 < 指定文件路径

# 示例
# 删除字符串 "hello world" 中所有出现过的 "l" 字符
echo "hello world" | tr -d "l"
# 删除字符串 "hello world" 中所有出现过的 "l"、"o"、"d" 字符,而不是 "lod" 这个字符串
echo "hello world" | tr -d "lod"
# 删除 test.txt 文件中所有的 "l" 字符
cat test.txt | tr -d "l"
tr -d "l" < test.txt
# 删除 test.txt 文件中所有出现过的 "l"、"o"、"d" 字符,而不是 "lod" 这个字符串
cat test.txt | tr -d "lod"
tr -d "lod" < test.txt

在这里插入图片描述

删除特殊字符

如果我们要删除换行符、制表符等特殊字符,需要通过转义字符。例如删除所有的换行符和制表符:

# 语法
cat 指定文件路径 | tr -d "\n\t"
# 示例
cat test.txt | tr -d "\n\t"

在这里插入图片描述

删除文件所有空行

如果要删除文件中的所有空行,可以用如下语法:

cat 指定文件路径 | tr -d "\r"
# 或者,下面这个是用 "\n" 字符替换所有的 "\r 字符
cat 指定文件路径 | tr -s "\r" "\n"

替换指定字符

如果我们要进行字符的替换,可以使用 -s 选项。替换指定字符的命令格式如下:

# 语法
echo 指定字符串 | tr -s 旧字符 新字符
# 示例,替换环境变量中所有的冒号字符为换行符
echo "$PATH" | tr -s ":" "\n"

在这里插入图片描述

字符集补集

字符集补集需要用到 -c 选项,命令格式如下:

tr -c [字符集1]

字符集1 的补集意味着从这个集合中包含 字符集1 中没有的所有字符。常用的用法是从输入文本中将不在补集中的所有字符全部删除。例如:

# 删除字符串 "hello 123 world" 中除了数字字符之外的所有字符,因为 "[0-9]" 的补集中包含除了数字字符之外的所有字符(如字母字符等),因为指定了 -d 选项,所以会把补集的所有字符全部删掉,只留下数字字符
echo "hello 123 world" | tr -d -c "[0-9]"

在这里插入图片描述

压缩字符

所谓的压缩字符就是如果出现连续重复的多个字符,只保留一个字符。例如字符串 "aaaa" 经过 tr -s 命令后就只剩下一个字符 "a" 了。命令格式如下:

# 语法
echo 字符串 | tr -s 指定压缩字符
# 示例,压缩字符串中的 "a" 字符
echo "abaacaaadaaaae" | tr -s "a"

在这里插入图片描述

注:如果想要压缩效果,必须是连续重复的字符才能压缩。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值