tr命令 #
tr
命令(translate)用于转换或删除字符。它可以将一组字符替换为另一组字符,或者删除特定字符。tr
命令从标准输入读取数据,将结果写入标准输出。
语法 #
tr [选项] 集合1 [集合2]
常用选项 #
选项 | 描述 |
---|---|
-c, --complement |
使用集合1的补集 |
-d, --delete |
删除集合1中的字符,不转换 |
-s, --squeeze-repeats |
将集合1中的连续重复字符替换为单个字符 |
-t, --truncate-set1 |
先将集合1截断为集合2的长度 |
--help |
显示帮助信息 |
--version |
显示版本信息 |
字符集合 #
字符集合可以是单个字符、字符列表或以下特殊序列:
序列 | 描述 |
---|---|
[:alnum:] |
所有字母和数字 |
[:alpha:] |
所有字母 |
[:blank:] |
所有水平空白字符(空格和制表符) |
[:cntrl:] |
所有控制字符 |
[:digit:] |
所有数字 |
[:graph:] |
所有可打印字符,不包括空格 |
[:lower:] |
所有小写字母 |
[:print:] |
所有可打印字符,包括空格 |
[:punct:] |
所有标点符号 |
[:space:] |
所有水平或垂直空白字符 |
[:upper:] |
所有大写字母 |
[:xdigit:] |
所有十六进制数字 |
字符范围可以使用起始字符-结束字符
的形式表示,例如a-z
表示所有小写字母。
常见用法 #
1. 替换字符 #
echo "hello" | tr 'a-z' 'A-Z'
输出:
HELLO
2. 删除特定字符 #
echo "hello world" | tr -d 'aeiou'
输出:
hll wrld
3. 删除除特定字符外的所有字符 #
echo "hello 123 world" | tr -cd '0-9\n'
输出:
123
4. 压缩重复字符 #
echo "hello world" | tr -s ' '
输出:
hello world
5. 转换大写为小写 #
echo "HELLO WORLD" | tr 'A-Z' 'a-z'
输出:
hello world
6. 删除所有数字 #
echo "hello123world" | tr -d '0-9'
输出:
helloworld
7. 将制表符转换为空格 #
cat file.txt | tr '\t' ' '
8. 删除所有非打印字符 #
cat file.txt | tr -cd '[:print:]\n'
9. 将多个空格转换为一个空格 #
echo "hello world example" | tr -s ' '
输出:
hello world example
10. 删除Windows风格的回车符 #
cat file.txt | tr -d '\r'
11. 创建字符集的补集 #
echo "hello 123 world" | tr -c '0-9\n' ' '
输出:
123
12. 转换字符并压缩 #
echo "hello world" | tr -s ' ' '_'
输出:
hello_world
与其他命令结合使用 #
1. 计算文本中的字符数 #
cat file.txt | tr -d '\n' | wc -c
2. 将文件内容转换为大写 #
cat file.txt | tr 'a-z' 'A-Z' > uppercase_file.txt
3. 删除文件中的所有标点符号 #
cat file.txt | tr -d '[:punct:]' > no_punctuation_file.txt
4. 将多行文本转换为单行 #
cat file.txt | tr '\n' ' '
5. 创建简单的ROT13加密 #
echo "hello" | tr 'a-zA-Z' 'n-za-mN-ZA-M'
输出:
uryyb
6. 删除重复的行(与sort和uniq结合) #
cat file.txt | sort | tr -s '\n' | uniq
实用示例 #
1. 创建字符集的交集 #
# 保留同时存在于两个文件中的字符
cat file1.txt | tr -cd "$(cat file2.txt)"
2. 将CSV文件转换为TSV文件 #
cat file.csv | tr ',' '\t' > file.tsv
3. 规范化文本(删除多余空白) #
cat file.txt | tr -s '[:space:]' ' '
4. 创建简单的凯撒密码 #
# 向右移动3位
echo "hello" | tr 'a-zA-Z' 'd-za-cD-ZA-C'
输出:
khoor
5. 删除非ASCII字符 #
cat file.txt | tr -cd '\11\12\15\40-\176'
6. 将十六进制转换为十进制 #
echo "FF" | tr '[:upper:]' '[:lower:]' | xargs -I{} echo "ibase=16; {}" | bc
输出:
255
7. 创建随机密码 #
head -c 100 /dev/urandom | tr -cd '[:alnum:]' | head -c 12
注意事项 #
-
tr
命令不接受文件名作为参数,它只从标准输入读取数据。要处理文件,需要使用重定向或管道。 -
当集合2比集合1短时,集合2的最后一个字符会被重复使用,除非使用了
-t
选项。 -
tr
命令不支持正则表达式,它只处理单个字符。 -
在使用字符类(如
[:alpha:]
)时,必须将它们包含在方括号中。
提示 #
- 使用
-s
选项可以压缩重复字符,这在处理格式不规范的文本时很有用 - 使用
-d
选项可以删除不需要的字符,如控制字符或特殊字符 - 使用
-c
选项可以创建字符集的补集,这在只保留特定字符时很有用 - 在处理包含特殊字符的文本时,可能需要使用引号或转义字符
tr
命令是一个简单但强大的文本处理工具,特别适合单字符的替换和删除- 对于更复杂的文本处理任务,可能需要使用
sed
或awk
等工具 - 在脚本中,
tr
通常与其他命令(如cat
、echo
、grep
等)结合使用