个人笔记(linux/tr命令)

发布于:2025-07-18 ⋅ 阅读:(16) ⋅ 点赞:(0)

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 选项的核心作用

  1. 压缩(Squeeze)
    将连续的多个空格 压缩为单个空格,然后再进行替换。

    bash

    # 处理流程:
    "a   b  c" → 压缩空格 → "a b c" → 替换空格 → "a\nb\nc"
  2. 避免空行
    如果不加 -s,多个连续空格会被分别替换为换行符,导致输出中出现空行。


实际案例演示

输入文件 file.txt 内容:
hello   world  how    are   you

(注意:单词间有 3个、2个、4个、3个空格)

两种命令对比:
  1. 不加 -s

    tr ' ' '\n' < file.txt

    输出

    hello
    
    
    world
    
    how
    
    
    are
    
    
    you
    

    (出现多个空行)

  2. 加 -s

    bash

    tr -s ' ' '\n' < file.txt

    输出

    text

    hello
    world
    how
    are
    you

    (干净无空行)


为什么词频统计需要 -s

在统计词频时,如果有多余空行:

  1. 会被 sort 当作有效空行处理

  2. uniq -c 会统计空行的出现次数

  3. 最终结果会出现干扰项:

    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' 是更健壮的选择。


网站公告

今日签到

点亮在社区的每一天
去签到