sed

sed:stream editor 流编辑器 ,主要用于文本处理。

sed命令格式:

1
2
3
4
sed   -options   ’expression1;expression2’     file           执行多个命令
sed   -options   [-e ‘expression1’] [-e ‘expression2’]  file  执行多个命令
sed   -options   [-f   scriptfile]   file                     通过脚本执行命令
sed   -options   [-f   scriptfile]   file  >  newfile  #sed修改后重定向到新文件。

sed指令需要用单引号包围。使用双引号“”可以传递变量。 Sed默认并没有修改文件file中的数据。 sed默认在stdout输出文件的所有行。 Sed地址需要使用/address/来包围。 sed使用正则表达式可以用\BRE\包围,如果模式包含/,那么可以使用除了换行符之外的所有字符包围。

options:

1
2
3
4
-e:指定多个命令或脚本
-f:指定执行命令的脚本
-n:阻止自动输出,p可以打印匹配的行。
-i: 直接修改读入的文件的内容.

experssion:

1
2
3
4
5
expression:指令由模式和过程组成。
[address]/[line-address][!]command[arguments]
[address]表示地址,一般用模式进行寻址,address缺省表示整个文件寻址,两个地址用,隔开。
[line-address]表示只能是一个地址。
[!] 表示不匹配该地址的所有行

Command:

sed有25个命令。

使用大括号{}在一个地址中做嵌套操作:例如:

1
2
3
4
5
/address1/,/address2/{
    /^$/d
    s/string1/string2/
    …
}             // 单独一行,后面不能有空格

s命令:替换,替换模式空间中的行。

1
sed '[address]s/oldpattern/newpattern/[flag]' filename

flag:

1
2
3
4
n:替换每个寻址行的第n个匹配模式。默认n=1. n在1-512之间。
g:替换每个寻址行的所有匹配模式。
p:打印模式空间的内容
w file:如果发生替换就将这一行写入file。只写入替换的行,不写入其它行.

用反斜杠\转义换行符:

因为反斜杠在newpattern中也用于包含换行符。

1
2
3
4
5
6
7
// 将匹配的项替换成两个换行符。
sed '
s/pattern/\ (换行)
\           (换行)
string/' filename
等价于:
sed 's/pattern/\n\n/' filename

用反斜杠\转义与符号&:

1
2
// 结果是: string1 pattern string2 
sed 's/pattern/string1 & string2/g' filename

如果不转义&匹配整个pattern:

1
2
// 结果是:string1 & string2
sed 's/pattern/string1 \& string2/g' filename

用反斜杠\转义\n:

1
2
// 将pattern中匹配到的第一个字串回调到newpattern中使用。
sed 's/pattern/\1/' filename

d命令:删除,删除模式空间中的行,并不删除文件中的行。

1
2
3
4
5
6
'[address]d'
'1d' 删除第一行
'$d' 删除最后一行
’/^$/d' 删除空行
‘/^\s\+$/d’  删除空白行(没有数字字符)
‘/^\s*$/d’ 删除空白行(没有数字字符)

a/i/c命令:追加/插入/更改.

1
2
3
4
5
6
// 在匹配到的行下面添加追加的内容
'[line-address]a string' filename
'[line-address]a\
string1\
string2\
string3' filename   (追加三行)

i:同上,在匹配到的行上面插入内容。

1
2
3
4
5
6
// 将匹配到的行替换掉。
'[address]c string' filename
'[address]c\
string1\
string2\
string3' filename

l:列表命令

1
sed '[address]l' filename   打印模式空间内容,将非打印字符显示为ASCII码

p:打印命令

1
sed '[address]p' filename   打印模式空间内容

=:打印行号

1
sed -n '[line-address]='  filename  只打印行号

n:下一步

1
sed '[address]n' filename

q:退出命令

1
2
// 一旦找到和line-address匹配的行,脚本立即退出。
sed '[line-address]q' filename

r/w:读/写命令

1
2
3
4
5
6
7
8
9
// 读file文件追加在匹配到的行后面。
sed '[line-address]r file'   filename

// 将匹配到的行写入到file文件中
sed '[address]w file'  filename

sed –I 's/.*/\L&/g' urfile   全部转换成小写
sed  -I 's/.*/\U&/g' urfile 全部转换成大写。
sed   ‘/pattern/{{n; p;}}’   urfile   读取pattern下一行并打印。

n:追加下一个输入行到匹配后面并在两者间嵌入新行,改变行号。

p:打印匹配的第一行。

常用

1
2
3
sed   ‘$a   string’   filenames           #批量往文件最后一行添加内容
sed   ‘$i    string’   filenames           #批量往文件倒数第二行添加内容
string里面有空格用\开头。