shell命令:tr替换命令

一般替换,将每个字符替换为相同位置对应字符:

echo "aabbaabb" | tr "ab" "12"  #11221122
echo "aabbaabb" | tr "ab" "1"   #相当于echo "aabbaabb" | tr "ab" "11"
echo "aabbaabb" | tr "a" "12"   #相当于echo "aabbaabb" | tr "a" "1" 

删除选项-d:

echo "hello 123 world 456" | tr -d "0-9"  #hello  world 
echo "hello 123 world 456" | tr -d "a-z"  # 123  456

补集选项-c(下面命令中-c "0-9"表示除了0-9外的所有其他字符):

echo "hello 123 world 456" | tr -c "0-9" "@"  #@@@@@@123@@@@@@@456@,最后面这个@是\n替换来的
echo "hello 123 world 456" | tr -d -c "0-9"   #123456

删除重复字符-s(只保留重复字符组中的第一个字符):

echo 'hello   world!!!' | tr -s ' !'  #hello world! 这里要用单引号,因为双引号中的!在命令行有历史命令的含义。

多字符映射替换-t(会先将原字符截断为何替换字符个数相等):

[root@ambari ~]# echo "abcba" | tr  "ab" "1"
11c11
[root@ambari ~]# echo "abcba" | tr -t "ab" "1"
1bcb1

# 不推荐用这种方法替换,容易出错,如:
[root@ambari ~]# echo "|hello world|" | tr  "hello" "abc  "
|ab    w r d|

帮助文档:

tr --help
用法:tr [选项]... SET1 [SET2]
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。

  -c, -C, --complement		首先补足SET1
  -d, --delete			删除匹配SET1 的内容,并不作替换
  -s, --squeeze-repeats	如果匹配于SET1 的字符在输入序列中存在连续的
				重复,在替换时会被统一缩为一个字符的长度
  -t, --truncate-set1		先将SET1 的长度截为和SET2 相等
      --help		显示此帮助信息并退出
      --version		显示版本信息并退出

SET 是一组字符串,一般都可按照字面含义理解。解析序列如下:

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

仅在SET1 和SET2 都给出,同时没有-d 选项的时候才会进行替换。
仅在替换时才可能用到-t 选项。如果需要SET2将被通过在末尾添加原来的末字符的方式
补充到同SET1 等长。SET2 中多余的字符将被省略。只有[:lower:][:upper:]
以升序展开字符;在用于替换时的SET2 中以成对表示大小写转换。-s 作用于SET1,既不
替换也不删除,否则在替换或展开后使用SET2 缩减。
posted @ 2018-12-17 09:03  xuejianbest  阅读(700)  评论(0编辑  收藏  举报