启动 sed 编辑器
sed 命令的格式:sed options script file
-e script 将script中指定的命令添加到处理输入时运行的命令中
-f file 将file文件中指定的命令添加到处理输入时运行的命令中
-n 不要为每条命令产生输出,但会等待打印命令
# 只有加上 -i 参数才会修改原文件,不然全是修改的数据流文本
-i[SUFFIX] 在原文件上修改,如果指定 SUFFIX,会将更新前的文件备份,文件名为原文件名+SUFFIX
-c 与 -i 搭配使用,复制一份更新前的文件,文件名固定为原文件名+c
script 参数指定了作用在数据流上的单条命令。如果需要不止一条命令,要么用 -e 选项在 命令行上指定它们,要么用 -f 选项在一个单独文件中指定它们
# 两个命令都作用到数据流中的每行数据上
sed -e 's/brown/green/; s/dog/cat/' data1.txt
sed 命令
替换
s 命令会替换输入流中的文本,格式为:s/pattern/replacement/flags
其中 pattern 是要被替换的文本,replacement 是 sed 要插到数据流中的新文本
flags 参数控制如何进行替换,有 4 种类型的替换标记可用:
- 一个数字,表明该模式出现的第几处应该被替换
- g: 表明所有该文本出现的地方都应该被替换
- p: 表明原来行中的内容应该被打印出来
- w file:表明替换的结果应该写入到文件 file 中
寻址
默认情况下,在 sed 编辑器中使用的命令会作用在文本数据的所有行上。如果想让命令只作用在指定行或一组行上,就必须使用行寻址(line addressing)
在 sed 编辑器中,有两种形式的行寻址:
- 行区间(数字形式)
- 可以过滤出特定行的文本模式
# 将 data1 数据流中的 2/3 行的 dog 替换为 cat
sed '2,3s/dog/cat/' data1
# 将数据流中包含 rich 的行的 bash 替换为 csh
sed '/rich/s/bash/csh/' /etc/passwd
# 将每一条替换命令都作用在数据流的第 2 行上
sed '2{
> s/fox/elephant/
> s/dog/cat/
> }' data1
删除行
# 所有的行都会被从数据流中删掉
sed 'd' data1
# 从流中删除第 3 行
sed '3d' data6
# 从流中删除 2/3 行
sed '2,3d' data6
# 从流中删除包含 number 1 的行
sed '/number 1/d' data6
插入和附加文本
- 插入(insert)命令(i)在指定行前面添加一个新行
- 附加(append)命令(a)在指定行后面添加一个新行
格式为:
sed '[address]command new line'
注意: 这里也是会修改数据流中的文本,不会修改原文件,要与 -i 参数区分开,只有加上 -i 参数才会修改原文件
echo "testing" | sed 'i\
> This is a test'
# This is a test
# testing
# 在数据流第 2 行前插入新行,即新插入行将在第 2 行
sed '2i insert new line' data.txt
# 在原文件第 2 行前插入新行
sed -i '2i insert new line' data.txt
echo "testing" | sed 'a\
> This is a test'
# testing
# This is a test
# 在数据流第 2 行后插入新行,即新插入行将在第 3 行
sed '2a insert new line' data.txt
修改行
# 替换数据流中第 3 行数据
sed '3c replace third line' data.txt
转换命令
转换(transform)命令(y)是唯一一个作用在单个字符上的sed编辑器命令,格式为:[address]y/inchars/outchars/
转换命令对 inchars 和 outchars 执行一对一的映射。inchars 中的第一个字符会转换为 outchars 中的第一个字符,inchars 中的第二个字符会转换为 outchars 中的第二个字符,依此 类推,直到超过了指定字符的长度。如果 inchars 和 outchars 长度不同,sed 编辑器会报错
# 替换数据流中所有的 m 为 n
sed 'y/m/n/' data.txt
# 替换数据流中第 2 行的 m 为 n
sed '2y/m/n/' data.txt
打印行
# -n 参数让 sed 不输出,p 让数据流中包含 number 3 的行输出
sed -n '/number 3/p' data6
写入到文件
w 命令用来将文本行写入到文件中,格式为:
[address]w filename
# 将 data6 的第 1/2 行写入到 test
sed '1,2w test' data6
从文件中读取
读取(read)命令(r)允许插入单个文件中的数据,格式为:
[address]r filename
# 将 data 文件中的全部文本插入到 data2 文件中第 3 行后
sed '3r data' data2
参考:《Linux命令行与Shell编程大全(第3版)》