tr和sed
sed
sed命令对文本的处理很强大,并且参数少,容易掌握,sed按顺序逐行读取文件。然后,它执行为该行指定的所有操作,并在完成请求的修改之后的内容显示出来,也可以存放到文件中。完成了一行上的所有操作之后,它读取文件的下一行,然后重复该过程直到它完成该文件。
sed 命令的基本格式如下:
sed [选项] '[脚本命令]' 文件名
选项 | 含义 |
---|---|
-e 脚本命令 | 该选项会将其后跟的脚本命令添加到已有的命令中。 |
-f 脚本命令文件 | 该选项会将其后文件中的脚本命令添加到已有的命令中。 |
-n | 取消默认控制台输出,仅显示处理后的结果 |
其中最常使用的使用sed来替换的脚本命令为:
sed -n '[address]s/pattern/replacement/flags'
其中,address 表示指定要操作的具体行,pattern 指的是需要替换的内容,replacement 指的是要替换的新内容。
address用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
address是一个数字,则表示行号;是“$”符号,则表示最后一行。address是逗号分隔的,那么需要处理的内容是这两行之间的范围(包括这两行在内)。
此命令中常用的 flags 标记
选项 | 含义 |
---|---|
n | 1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记; |
g | 对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A; |
p | 会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。 |
d | 删除行 |
像这种比较抽象的命令应该多举几个例子:
删除
sed '1,3d' test.txt
,删除第1~3行
删除hello.h文件中的空行,保存到hello2.h
sed -e 's/^[[:space:]]*$//g' hello.txt > hello2.txt
替换
sed 's/old/new/' testfile
,把testfile文件中的old替换成new,只替换一次及终止在这一行的操作
sed 's/old/new/g' testfile
,用new把文件testfile中的old全部替换掉
sed -n 's/old/new/p' testfile
,只打印那些发生替换的行
cat test | sed -ne '2,8s/^zhang/ying/gp'
,在第二行,到第八行之间,替换以zhang开头的行,用ying来替换,并显示替换的行
在一个reference.bib文件中,将所有”…”替换为{…}
sed -e 's/"\([^"]*\)"/{\1}/g' reference.bib
使用下来你会发现其实和vi中的替换很类似,同样都是用 / 分割,当然也不一定,比如:
查找/usr/include/boost目录下的所有头文件,然后将之替换为/usr/local/include/boost路径,输出到header文件
find /usr/include/boost -name "*.h" | sed -e 's:/usr/include/\(.*\):/usr/local/include/\1:g' > header
其中使用的是: 为分隔符
tr
tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。
用法:
tr [选项]... SET1 [SET2]
选项 | 功能 |
---|---|
-c | 取代所有不属于第一字符集的字符 |
-d | 删除所有属于第一字符集的字符 |
-s | 把连续重复的字符以单独一个字符表示 |
-t | 削减 SET1 指定范围,使之与 SET2 设定长度相等 |
仅在SET1 和SET2 都给出,同时没有-d 选项的时候才会进行替换。利用tr命令将一个dos结尾的\r\n文本文件变换为Unix结尾的\n
tr -d "\r" < a.txt > b.txt
tr -s "\r\n" "\n" < a.txt > b.txt
大写字母转小写
echo "TANK" |tr A-Z a-z
#大写字母转小写
cat aaa.txt|tr 'a' 'c'
#字母c替换字母a
cat aaa.txt|tr -d 'a'
#删除所有字母a
cat aaa.txt|tr -s '\n'
#删除空行