tr命令

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

注意事项 #

  1. tr命令不接受文件名作为参数,它只从标准输入读取数据。要处理文件,需要使用重定向或管道。

  2. 当集合2比集合1短时,集合2的最后一个字符会被重复使用,除非使用了-t选项。

  3. tr命令不支持正则表达式,它只处理单个字符。

  4. 在使用字符类(如[:alpha:])时,必须将它们包含在方括号中。

提示 #

  • 使用-s选项可以压缩重复字符,这在处理格式不规范的文本时很有用
  • 使用-d选项可以删除不需要的字符,如控制字符或特殊字符
  • 使用-c选项可以创建字符集的补集,这在只保留特定字符时很有用
  • 在处理包含特殊字符的文本时,可能需要使用引号或转义字符
  • tr命令是一个简单但强大的文本处理工具,特别适合单字符的替换和删除
  • 对于更复杂的文本处理任务,可能需要使用sedawk等工具
  • 在脚本中,tr通常与其他命令(如catechogrep等)结合使用