个人笔记(linux/tr命令)
1. tr
命令(字符转换)
功能:字符替换、删除、压缩
核心语法:
tr [选项] SET1 SET2
常用场景:
场景 | 命令示例 | 说明 |
---|---|---|
替换字符 | tr 'a-z' 'A-Z' < file | 小写转大写 |
删除字符 | tr -d '\r' < file | 删除Windows换行符(\r ) |
压缩字符 | tr -s ' ' < file | 将多个空格合并为1个 |
字符映射 | tr ' ' '\n' < file | 空格转换行符 |
注:在 tr
命令中,' '
和 ' ' 之间必须有空格,因为它们是两个独立的参数
关键选项:
-s
:压缩连续重复字符(Squeeze)-d
:删除指定字符(Delete)
示例演示:
# 原始文本:"hello world"
echo "hello world" | tr -s ' ' # 输出:"hello world"
echo "hello world" | tr ' ' '\n'
# 输出:
# hello
#
# world
如果这样写呢tr -s ' ' '\n' < file
如果使用 tr -s ' ' '\n' < file
(注意 -s
选项),效果会有 关键区别。以下是详细对比和解释:
原始命令 vs 加 -s
的命令
命令 | 作用 | 输入 "a b c" (多个空格) | 输出结果 |
---|---|---|---|
tr ' ' '\n' < file | 单纯空格换行 | a⏎⏎⏎b⏎⏎c | 产生空行 |
tr -s ' ' '\n' < file | 压缩空格后换行 | a⏎b⏎c | 无空行 |
-s
选项的核心作用
压缩(Squeeze):
将连续的多个空格 压缩为单个空格,然后再进行替换。bash
# 处理流程: "a b c" → 压缩空格 → "a b c" → 替换空格 → "a\nb\nc"
避免空行:
如果不加-s
,多个连续空格会被分别替换为换行符,导致输出中出现空行。
实际案例演示
输入文件 file.txt
内容:
hello world how are you
(注意:单词间有 3个、2个、4个、3个空格)
两种命令对比:
不加
-s
:tr ' ' '\n' < file.txt
输出:
helloworldhowareyou
(出现多个空行)
加
-s
:bash
tr -s ' ' '\n' < file.txt
输出:
text
hello world how are you
(干净无空行)
为什么词频统计需要 -s
?
在统计词频时,如果有多余空行:
会被
sort
当作有效空行处理uniq -c
会统计空行的出现次数最终结果会出现干扰项:
3 # 空行的统计 2 apple 1 banana
使用 -s
可以确保 只处理有效单词。
进阶技巧
如果想处理 所有空白字符(包括Tab):
bash
tr -s '[:space:]' '\n' < file.txt
[:space:]
:匹配所有空白字符(空格、Tab等)
总结选择原则
场景 | 推荐命令 |
---|---|
严格按单个空格分割 | tr ' ' '\n' |
处理人类输入的文本(可能有多个空格) | tr -s ' ' '\n' |
处理混合空白符(空格+Tab) | tr -s '[:space:]' '\n' |
在大多数实际应用中(包括词频统计),使用 tr -s ' ' '\n'
是更健壮的选择。