tr命令

本文详细介绍了Linux下tr命令的使用方法,包括如何通过tr命令替换、压缩或删除字符,以及其语法和各种选项如-c、-d、-s、-t的具体应用。同时,提供了多个实例演示如何利用tr命令进行文本处理。

  从标准输入中替换,压缩或删除字符,写入标准输出。

  语法:

    tr [option]... set1 [set2]

  选项:

    -c:取代所有不属于set1的字符;

    -d:删除所有属于set1的字符(与c结合就是删除所有不属于set1的字符);

    -s:把连续的字符,只保留一个字符;

    -t:将set1截断为set2的长度,即删除set1比set2多出的字符数。

  set是一串字符串:

  \NNN    八进制值为NNN 的字符(1 至3 个数位)
  \\        反斜杠
  \a        终端鸣响
  \b        退格
  \f        换页
  \n        换行
  \r        回车
  \t        水平制表符
  \v        垂直制表符
  字符1-字符2    从字符1 到字符2 的升序递增过程中经历的所有字符
  [字符*]    在SET2 中适用,指定字符会被连续复制直到吻合设置1 的长度
  [字符*次数]    对字符执行指定次数的复制,若次数以 0 开头则被视为八进制数
  [:alnum:]    所有的字母和数字,相当于[a-zA-Z0-9]
  [:alpha:]    所有的字母,相当于[a-zA-Z]
  [:blank:]    所有呈水平排列的空白字符
  [:cntrl:]    所有的控制字符
  [:digit:]    所有的数字,相当于[0-9]
  [:graph:]    所有的可打印字符,不包括空格
  [:lower:]    所有的小写字母,相当于[a-z]
  [:print:]    所有的可打印字符,包括空格
  [:punct:]    所有的标点字符
  [:space:]    所有呈水平或垂直排列的空白字符
  [:upper:]    所有的大写字母,相当于[A-Z]
  [:xdigit:]    所有的十六进制数
  [=字符=]    所有和指定字符相等的字符

实例:

    1:将小写字母换成大写字母:

      

    2:将所有除了小写字母和换行符以外的字符换成空白符:

      

    3:删除除了大写字母和标点符号和换行符的其他字符:

      

     4:压缩重复字符“fd g”:

      

     5:根据上题,将“fd g”压缩并替换成“1-4”:

      

 

转载于:https://www.cnblogs.com/Stong/p/6825015.html

<think>我们正在讨论如何使用`tr`命令。根据引用,`tr`命令用于转换、压缩或删除字符。它从标准输入读取数据,处理后将结果输出到标准输出。 主要用途: 1. 字符转换(如将小写转为大写) 2. 删除字符 3. 压缩重复字符 基本语法: tr [选项] SET1 [SET2] 注意:`tr`命令不接受文件名作为参数,所以必须通过管道或输入重定向来提供输入。 根据引用[1]和引用[2]: - 转换:`tr 'set1' 'set2'`,将输入中属于set1的字符替换为set2中对应位置的字符。 - 删除:`tr -d 'set1'`,删除输入中属于set1的字符。 - 压缩:`tr -s 'set1'`,将输入中重复的set1中的字符压缩为一个。 另外,引用[3]和引用[4]提供了具体的转换例子。 下面我们详细说明: 1. 转换字符: 例如,将小写字母转换为大写字母: echo "hello world" | tr 'a-z' 'A-Z' 输出:HELLO WORLD 另一个例子(引用[3]): echo '12345' | tr '0-9' '9876543210' 输出:87654 (因为1被9替换,2被8替换,以此类推) 引用[4]的例子是一个ROT13密码(字母按字母表旋转13位): echo "uv,guvf vf uhvtr" | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' 'NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm' 输出:hi, this is hidden 2. 删除字符: 例如,删除数字: echo "hello123" | tr -d '0-9' 输出:hello 3. 压缩字符: 例如,将多个连续空格压缩为一个空格: echo "hello world" | tr -s ' ' 输出:hello world 另外,还可以同时使用多个操作,比如先转换再压缩,但是注意一次只能做一个操作(转换、删除、压缩中的一种)。不过可以通过管道组合多个tr命令。 选项: -c 或 --complement:取字符集的补集(即匹配不在set1中的字符) -d 或 --delete:删除字符 -s 或 --squeeze-repeats:压缩重复字符 -t 或 --truncate-set1:将set1的长度截断为set2的长度(在转换时使用) 注意: - 字符集可以使用范围表示,如a-z, A-Z, 0-9等。 - 也可以使用预定义字符类,如:[:alnum:](字母和数字)、[:alpha:](字母)、[:digit:](数字)等,但需要放在'[::]'中,例如:tr '[:lower:]' '[:upper:]' 举例: 删除所有非数字字符: echo "phone: 123-456" | tr -cd '[:digit:]' 输出:123456 (因为-c取补集,即非数字字符,然后-d删除) 重要:由于tr处理的是单个字符,所以它不能用于多字符替换(如将"hello"替换为"world"),这种情况应该使用sed。 现在,我们结合用户之前的问题(拆分字符串)来展示tr的另一种用法:将逗号替换为空格,从而便于shell进行单词分割(但注意空格处理问题,如果有空格字段则不合适)。 例如,拆分逗号分隔的字符串(但前提是字段内没有空格): str="apple,banana,orange" arr=($(echo $str | tr ',' ' ')) for fruit in "${arr[@]}"; do echo $fruit done 输出: apple banana orange 但是,如果字段内包含空格,这种方法就会出错。因此,在复杂情况下建议使用之前提到的IFS方法。 总结tr命令的使用方法: 1. 转换:tr 'set1' 'set2' 2. 删除:tr -d 'set1' 3. 压缩:tr -s 'set1' 并且,tr命令通常与管道一起使用。 下面我们生成相关问题。</think>### Shell 中 `tr` 命令的使用方法详解 `tr`(translate/transform)是 Linux Shell 中强大的字符处理工具,主要用于字符转换、删除和压缩操作。它从标准输入读取数据,处理后输出到标准输出,常与管道符 `|` 结合使用。 --- #### 一、核心功能与应用 1. **字符转换**(基本用法) 将输入字符集中的字符映射到目标字符集: ```bash echo "hello" | tr 'a-z' 'A-Z' # 小写转大写 → HELLO[^3] echo "123" | tr '0-9' '9876543210' # 数字转换 → 876[^3] ``` 2. **字符删除**(`-d` 选项) 删除指定字符集中的字符: ```bash echo "Phone: 123-456" | tr -d '[:digit:]-' # 删除数字和横线 → Phone: [^2] ``` 3. **字符压缩**(`-s` 选项) 将重复字符压缩为单个: ```bash echo "too many spaces" | tr -s ' ' # 压缩连续空格 → too many spaces[^1] ``` 4. **字符类操作** 使用预定义字符类简化操作: ```bash echo "UPPER lower" | tr '[:upper:]' '[:lower:]' # 大写转小写 → upper lower echo "Text!@#" | tr -d '[:punct:]' # 删除标点 → Text ``` --- #### 二、高级用法示例 1. **ROT13 加密/解密** ```bash echo "secret" | tr 'A-Za-z' 'N-ZA-Mn-za-m' # 加密 → frperg[^4] echo "frperg" | tr 'A-Za-z' 'N-ZA-Mn-za-m' # 解密 → secret ``` 2. **文件内容批量处理** 将文件中的换行符替换为逗号: ```bash cat data.txt | tr '\n' ',' # 生成逗号分隔字符串 ``` 3. **删除不可见字符** 删除 Windows 文件中的回车符 `\r`: ```bash tr -d '\r' < winfile.txt > unixfile.txt ``` --- #### 三、关键注意事项 1. **字符集映射规则** - 若 `SET1` 比 `SET2` 长,`SET2` 的最后一个字符会被重复使用 ```bash echo "abcde" | tr 'abcde' '12' # 输出 11222 ``` - 支持字符范围(如 `a-z`)、八进制转义(如 `\012`)和命名字符类 2. **不支持正则表达式** `tr` 只能处理单个字符,不支持多字符模式匹配(需用 `sed` 或 `awk`) 3. **输入输出限制** - 不接受文件名参数,必须通过管道或重定向输入 - 无法直接修改源文件,需重定向保存结果: ```bash tr ';' ',' < input.csv > output.csv ``` --- ### 典型应用场景 | 场景 | 命令示例 | 效果 | |------|----------|------| | 路径斜杠转换 | `echo "C:\Windows" | tr '\\' '/'` | `C:/Windows` | | 删除空格 | `echo " a b c " | tr -d ' '` | `abc` | | 生成序列 | `echo {1..5} | tr ' ' '\n'` | 竖排数字列表 | | 编码转换 | `echo "Привет" | tr 'А-Яа-я' 'A-Za-z'` | 西里尔→拉丁字母 | > 提示:复杂文本处理(如含空格的 CSV 解析)建议结合 `awk` 或专用工具[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值