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的主要内容,如果未能解决你的问题,请参考以下文章