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

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux命令之字符替换压缩删除tr相关的知识,希望对你有一定的参考价值。

概述

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


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

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

语法

该命令的语法如下:

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

该命令支持的选项有:

选项说明
-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 中的字符个数最好一一对应。

转换大小写

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

# 语法
# 将所有的小写字母转换成大写字母
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"

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

开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于Linux命令之字符替换压缩删除tr的主要内容,如果未能解决你的问题,请参考以下文章

Linux 之 tr 命令

linux系统之tr命令

Linux命令之tr

Linux常用命令——tr

tr命令

linux中 tr 命令的基础运用