sed编辑器
流编辑器,在编辑器处理数据之前基于预先提供的一组规则来编辑数据流,每次从输入中读取一行,用提供的编辑器命令匹配数据、按命令中指定的方式修改流中的数据,然后将生产的数据输出到STDOUT,在流数据将所有命令与一行数据匹配后,它会读下一行数据并重复这个过程,在流编辑器处理完流中的所有数据行后,它就会终止。
set options screipt file
s命令用斜线间指定的第二个文本字符串来替换第一个文本字符串
echo "This is a test" | sed 's/test/BIG TEST/'
-e执行多个命令
cat data1
sed -e 's/brown/green/' -e 's/dog/cat/' data1
从文件中读取编辑器命令
cat script1
sed -f script1 data1
替换标记
数字:表明新文本将替换第几处模式匹配的地方
g:表明新文本将会替换所有已有文本出现的地方
p:表明原来行的内容要打印出来
w:将替换的结构写到文件中
cat data5
sed 's/test/trial/2' data5 #替换每行的第二处
sed 's/test/trial/g' data5
sed -n 's/test/trial/p' data6 #打印与指定的模式匹配的行.-n进制sed编辑器输出
sed -n 's/test/trial/w test' data6 #不输出到stdout,输出到test文件
替换字符
转义字符\
sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
用!作为字符串分隔符
s!/bin/bash/!/bin/csh!' /etc/passwd
使用地址
默认情况下,sed编辑器中的命令会作用于文本数据的所有行,如果只想将命令作用于特定某些行,必须使用行寻址
[address]command
address{
command1
command2
command3
}
eg. 指定行
sed '2s/dog/cat/' data1
eg.使用行地址范围
sed '2,4s/dog/cat/' data1 #第2行到第4行
eg.作用到文本结尾
sed '2,$s/dog/cat/' data1
使用文本模式过滤器
/pattern/command #只会作用到包含指定文本模式的行上
sed -n '/root/s/bash/csh/p' /etc/passwd
组合命令
sed '2{ #作用到第二条命令上
s/fox/elephant/
s/dog/cat/
}' data1
sed '3,${ #作用到第3行到文本尾
s/fox/elephant/
s/dog/cat/
}' data1
删除行
eg 删除某个范围的行
sed 'd' data1 #删除所有行
sed '3d' data7 #删除第3行
eg删除匹配某个模式的行
sed '/line number 2/d' data7 #删除与pattern匹配的行
eg. 删除两个模式范围内的行,第一个模式打开行删除功能,第二个模式关闭行删除功能
cat data8
sed '/1/,/3/d' data8
附加和插入文本
"Test line 2" | sed 'i\Test line 1' #使用插入命令时,文本会出现在数据流文本前面
echo "Test line 2" | sed 'a\Test line 1' #使用附加命令时,文本会出现在数据流文本后面
'3i\This is an inserted line.' data7 #插入到文本第3行
sed '$a\This is a new line of text.' data7
修改行
sed '3c\This is a changed line of text.' data7
sed '/number 1/c\This is a changed line of text.' data8 #修改模式匹配的行
转换命令
唯一可以处理单个字符的编辑器命令
[address]/inchars/outchars/ #inchars和outchars会进行一对一映射
sed 'y/123/789/' data8
回顾打印
sed -n '/number 3/p' data7
在修改之前显示行
sed -n '/3/{
p #修改之前打印
s/line/test/p #修改之后打印
}' data7
打印行号
sed '=' data1
-n '/number 4/{
= #打印行号
p
}' data7
4
使用文件
向文件写入
[address] w filename
sed '1,2w test' data7
cat test
从文件中读取数据
[address] r filename
sed '3r data12' data7
sed '/number 2/r data12' data7