Sed 常用语法

Sed编辑器被称做流编辑器(stream editor),流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
Sed编辑器可以基于输入到命令行的或是存储在命令文本文件中的命令来处理数据流中的数据。它每次从输入中读取一行,用提供的编辑器命令匹配数据、按命令中指定的方式修改流中的数据,然后将生成的数据输出到STDOUT。在六编辑器将所有命令与一行数据进行匹配后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。
使用方法:
1.在命令行定义编辑器命令:
$ echo "This is a test" | sed 's/test/test1'
$ sed 's/test/test1' datafie
2.在命令行中使用多个编辑器命令:-e
$ sed -e 's/A/B/ ; s/C/D/' datafile(一个单引号中间是分号)
3.从文本中读取编辑器命令:
$ sed -f script datafile
$cat script
s/A/B/
s/C/D/
$

一.替换标记:
s/pattern/replacement/flags,有4种可用的替换标记:
1.数字:表明新文本将替换地挤出模式匹配的地方(例如“2”则替换第二处匹配的地方);
2.g:表明新文本将替换所有已有文本出现的地方;
3.p:打印与pattern匹配的替换后的行(通常跟 “-n” 一起使用);
4.w filename:将替换结果写入到文件中。

二.使用地址:
默认情况下,在sed编辑器中使用的命令会作用于文本数据的所有行。如果只是想将命令作用于特定的行或者某些行,就要用到行寻址。寻址方式分为两种:
1.数字方式的行寻址:(跟vi下的替换有些类似)
$ sed ‘2s/A/B/' datafile(只对第二行起作用)
$ sed ’2,3s/A/B/' datafile (只对第二行第三行起作用)
$ sed ’2,$s/A/B/' datafile (只对第二行到最后一行起作用)
2.使用文本模式过滤器:
$ sed ‘/X/s/A/B/’ datafile(匹配X的行中B替换A)
3.组合命令:(指定一个地址范围并且执行多条命令)
$ sed '3,${
> s/A/B/
>s/C/D/
}' datafile

三.删除行:( sed编辑器不会修改原始文件
$ sed ‘3,$d' datafile(删除第三行到最后一行)
$ sed ‘/pattern/’ datafile(删除匹配模式i的行)
$ sed ‘/pattern1/,/pattern2/d’ datafile(删除两个模式间的行,第一个模式”打开“删除,第二个模式”关闭“删除)

四.插入和附加文本:
插入(insert)命令i会在指定行前增加一个新行;
追加(append)命令a会在指定行后增加一个新行。
$ echo "Test 2" | sed 'i\Test 1'
Test 1
Test 2

$ sed '3a\Test 1' datafile(在第三行后面追加Test 1)

五.修改行:
$ sed ’3c\Test 1‘ datafile(把第三行修改为Test 1)
$ sed ’/A/c\Test 1‘ datafile(把所有匹配的行修改为Test 1)

六.转换命令:( 唯一可以处理单个字符的sed命令,全局命令
[addres]y/inchars/outchars/(进行inchars和outchars值得一对一映射)

$ echo ”This 1 is a test of 1 try" | sed '/y/123/456/'
This 4 is a test of 4 try

七.关于打印:
$ echo "This is a test" | sed 'p'
this is a test
this is a test
$ sed -n '/pattern/p' datafile

$ sed '=' datafile(打印行号和数据)
1
This is one
2
This is two

$ sed -n 'l' datafile(列出命令 ”l” 允许打印数据流中的文本和不可打印的ASCII字符)
This\tis\tone$

八.sed文件操作:
1.向文件写入:[address]w filename(必须要有写入权限)
$ sed '1,2w Test' datafile(将datafile的前两行打印到Test这个文件中)
$ sed '/pattern/w Test' datafile(将datafile匹配模式的行打印到Test这个文件中)

2.从文件读取:[address]r filename
$ sed '3r datafile2' datafile(将datafile2的文本插入到datafile的第三行后面)
$ sed '/pattern/r datafile2' datafile(将datafile2的文本插入到datafile的匹配行后面,全局)

猜你喜欢

转载自blog.csdn.net/u013181216/article/details/80303305