Linux命令之sed

来源:互联网 发布:java宾馆客房管理系统 编辑:程序博客网 时间:2024/05/21 21:42

sed: stream editor
sed是面向字符流的,从文本文件中一次一行的读取输入,经过处理后,将结果发送到标准输出端。
sed本身不会修改输入文件本身,它只是改变了输入文件的副本,并将结果输出到标准输出设备。

sed的使用有两种方式:
1 命令行模式
sed [[address][,address]] command infile
一般用单引号将 address command 括起来。
2 脚本模式
sed -f script infile
-f后接的是脚本文件名

两种方式其实是一样的,只是将[[address][,address]] command部分单独放在了脚本文件中。

sed 默认会自动输出所有行,使用-n参数禁止自动输出。

sed之行地址:
首先介绍命令行中的address。 sed是以行为单位进行处理的。address选项提供了对于行的控制操作。行地址是每个命令可选的参数。sed命令可以指定零个,一个或两个地址。每个地址都是一个描述模式,行号或者行寻址符号的正则表达式。

  • 如果没有指定地址,那么命令将应用于每一行
  • 如果只有一个地址,那么命令应用于这个地址匹配的任意行
  • 如果指定了由逗号分隔的两个地址,那么命令应用于第一个地址的第一行和它后面的行,直到匹配第二个地址的行(包括该行)
  • 如果地址后面跟有感叹号(!),那么命令就应用于不匹配该地址的所有行

我们以删除命令d来解释寻址工作。

sed ‘d’ file
没有指明地址,删除所有行

sed ‘1d’ file
行号指明第一行,删除第一行,行号是指由sed维护的内部行数.

sed ‘$d’ file
$为行寻址符号,表示最后一行,即删除最后一行

sed ‘/^$/d’ file
删除空行。
注意,用正则表达式表示地址时,正则表达式必须封闭在斜杠(/)中

sed ‘/^TS/ , /^TE/ d’ file
删除以TS开头的行到以TE开头的行之间的行,注意,如果以TS开头到以TE开头的行有多个,则都要删除。例子如下:

/var/root # cat file                                                            abbb                                                                            baaa                                                                            abbb                                                                            baaa                                                                            cccc      
/var/root # sed '/^a/,/^b/ d' file                                              cccc                              

删除以a开头到以b开头的行,有两组,都被删除了。符合模式匹配的行都被删除了.

sed ‘50,$ d’ file
删除50行到最后一行

sed ‘1,/^$/ d’ file
删除从第一行知道第一个空行的所有行。

sed ‘/^TS/,/^TE/! d’ file
地址后加感叹号,表示删除在TS开头和TE开头的行之外的所有行。

保存和输出:
可以将结果保存在单独的文件中
sed ‘/^TS/,/^TE/! d’ file > outfile
sed -f script file > outfile
使用IO重定向,注意,输入输出文件不能是同一个。

多重指令:
对于同一个文件,指明多个指令,有3中方式可以实现:
1 用分号分隔指令
sed ‘s/MA//BB/; s/C/D/’ file
2 在每个指令前放置-e
sed -e ‘s/MA//BB/’ -e ‘s/C/D/’ file
3 使用Bourne Shell的分行指令工能。在输入单引号后按Enter键,就会出现多行输入的提示符(>)。
> sed ’
>s/MA//BB/
>s/C/D/’ list

分组命令
sed使用大括号{}将一个地址嵌套在另一个地址中,或者在相同的地址上应用多个命令
如果想指定行的范围,然后在这个范围内指定另一个地址,则可以嵌套地址。
/^TS/,/^TE/{
/^$/d
}
左大括号必须在行末,而且右大括号分身必须单独占一行。要确保在大括号之后没有空格。

可以用大括号将编辑命令括起来对某个范围的行应用多个命令:
/^TS/,/^TE/{
/^$/d
s/ps/qs/
}

基本sed命令:
sed命令集由25个命令组成。我们只介绍一些常用的命令。
替换
命令格式:
[address] s/pattern/replacement/flags
这里修饰替换的标识flags是:
n : 1到512之间的一个数字,表示对文本模式中指定模式第n次出现的情况进行替换
g :对模式空间的所有出现的情况进行替换。默认情况下只有第一次出现的情况被替换
p: 打印模式空间的内容.只输出替换的行
W file:将模式空间的内容写到文件file

替换元字符:
replacement是一个字符串,用来替换与正则表达式匹配的内容。在replacement中,只用下列字符有特殊含义。
& : 用正则表达式匹配的内容替换
\n:匹配第n个子串,这个子串以前在pattern中用”(“和”)”指定
\: 当在替换部分包含&,\,和定界符时,可用\转义他们。

1 用换行符替换逗号
column1,column2,column3,column4
s/,/\
/2
在反斜杠后面不允许有空格, 结果为
column1,column2
column3,column4

输入为: on the UNIX Operating System
s/UNIX/Linux & Unix/
结果为:
on the Linux Unix Unix Operating System
这个因为&代表pattern串。如果要输出&,需要转义。
s/UNIX/Linux \& Unix/

删除
前面讲过

追加,插入和更改
追加[line-address]a\
text

插入[line-address]i\
text

更改[line-address]c\
text

插入命令将所提供的文本放置在模式空间的当前行之前,追加命令将文本放在当前行之后。更改命令用所提供的的文本取代模式空间的内容。

这些命令中的每一个都要求后面跟一个反斜杠用于转义第一个行尾。

1)命令i在指定行前增加一个新行,命令a在指定行后附加一个新行
# echo “it is line 2”| sed ‘i\it is line 1’ //i之后为右\符号
it is line 1
it is line 2

# echo “it is line 2”| sed ‘a\it is line 1’
it is line 2
it is line 1

2)对指定行前插入或附加多行
# cat dataline
line 1
line 2
line 3
# sed ‘1i\ //i前加数字,指定第几行
> it is line 1\ //插入多行每行的开头需加反斜线
>it is line 2’ dataline
it is line 1
it is line 2
line 1
line 2
line 3

# sed ‘1a\
> it is line one\
> it is line two’ dataline
line 1
it is line one
it is line two
line 2
line 3

3)修改行,机制同插入与附加
# sed ‘1c\it is line one’ dataline
it is line one
line 2
line 3

4)修改多行
cat file
line1
line2
line3
sed ‘1,2 c\line’ file
line
line3
可以看出,直接将line1和line2改成了line。
更改命令可以一次处理一个范围的行。

插入命令和追加命令不影响模式空间的内容。
在sed执行插入命令时,插入的文本在当前行的前面输出,模式空间不变。后续命令匹配新插入的字符串会失败。

转换
命令格式:
[address] y/abc/xyz
这个命令按位置将字符串abc中的每个字符替换成字符串xyz中相同位置的字符。

echo “abc” | sed ‘y/abc/xyz’
结果:xyz

如果前面的字符个数少于后面,则后面缺失的不替换
echo “abc” | sed ‘y/ab/xyz’
结果:xyc

原创粉丝点击