tr
tr
命令将文本中的一个字符替换为另一个字符(除非挤压字符),它不直接读取文件,而是从标准输入中读取信息,它的语法如下:
tr [-cds] [set1 [set2]]
tr
命令将字符集set1
中的字符替换为字符集set2
中的字符。
下面是data
文件中的内容:
$ cat data
abc
DEF
GHi
abC
12345
67890
下面的命令将data
文件中a
替换为X
:
$ tr a X < data
Xbc
DEF
GHi
XbC
12345
67890
也可以指定两个字符集,下面的命令将data
文件中的a
替换为A
、b
替换为B
、c
替换为C
:
$ tr abc ABC < data
ABC
DEF
GHi
ABC
12345
67890
tr
命令常用的三个命令参数是:
-
-c
:匹配所有不在第一个字符集中的字符。 -
-d
:删除匹配的字符。 -
-s
:挤压字符。
先来看-c
选项,它匹配所有不在第一个字符集中的字符,比如$ tr -c '\n' X < data
将data
文件中所有不是\n
(换行符)的字符替换为X
:
$ tr -c '\n' X < data
XXX
XXX
XXX
XXX
XXXXX
XXXXX
-d
选项删除匹配的字符,下面的命令删除输入中所有小写字母字符:
$ tr -d [:lower:] < data
DEF
GH
C
12345
67890
在第一个字符集比第二个字符集字符多时候,可以挤压字符,下面的命令将连续的多个小写字符(一个或多个)替换为一个字符x
:
$ tr -s [:lower:] x < data
x
DEF
GHx
xC
12345
67890
sed
sed
不是一个简单的程序,它是一个与shell无关的语言解释器,但这里只介绍它的简单用法。
sed
程序从头到尾处理所有数据:
- 从输入流中读取一行;
- 对改行执行指定的指令;
- 将更改写入输出流中。
data
文件内容如下:
$ cat data
abc
DEF
GHi
abC
12345
67890
下面的命令将data
文件中第一行的ab
替换为CD
:
$ sed '1s/ab/CD/g' data
CDc
DEF
GHi
abC
12345
67890
如果想要将更改保存到原文件,需要使用-i
选项,下面的命令将更改保存到原文件(data
)中:
$ sed -i '1s/ab/CD/g' data
如果要连续写多条指令,可以使用-e
选项:
$ sed -e '1s/ab/AB/g' \
> -e '4s/C/c/g' data
ABc
DEF
GHi
abc
12345
67890