数据处理工具之sed

1.sed是以行为单位进行数据处理的。sed是管道命令。


2.sed命令格式

sed [-options] '[n1 [,n2]] funtion'

其中,n1,n2表示行号,是可选的参数($符号表示最后一行)。funtion的类型如下所示:

a:新增,新增行出现在当前行的下一行

c:替换

d:删除

i:插入,新增行出现在当前行的下一行

p:打印

s:查找并替换


3.sed的用法举例

(1)以行为单位的新增/删除功能

eg. nl /etc/passwd | sed '2,4d'  ——表示删除第2到4行的内容。

eg. nl /etc/passwd | sed '2a wahaha' ——表示在第二行后加上内容为wahaha的一行。

(2)以行为单位的替换和显示功能

eg. nl /etc/passwd | sed '2,5c wahaha' ——表示将第2到5行的内容替换成内容为wahaha的一行。

eg. nl /etc/passwd | sed -n '5,7p' ——表示将第5到7行的内容打印出来。-n选项表示的是安静模式。

(3)以行为单位替换行中的部分数据的功能

形式为:sed 's/要被替换的字符串/新的字符串/g'

备注,如果上述形式中没有g标记,那么每行只有第一个匹配的串会被替换,后面匹配的均不会被替换,是每行都是只有第一个匹配才会被替换哦。如果后面是/Ng表示每行从第N个匹配处开始操作。

(4)sed '1,/^wahaha/d'   将第一行到以wahaha开始的行之间的行删除。


4.sed的常用选项:

-n 表示sed使用安静模式,默认情况下sed会将sed处理过的行以及其他未经sed处理的行全部输出到屏幕上,但加上-n选项,sed只会将sed特殊处理过的行打印到屏幕上。

-i  直接编辑文件内容,很危险的选项。如果在sed命令中加入-i选项,那么就可以直接修改文件的内容,但这个应用场景要谨慎使用。

-e  与-f对应,-e直接在命令行进行sed的动作编辑。另外,在命令行上一个sed命令中可有多个-e参数。例如,sed -i -e 's/^\[\.*/[/g' -e 's/^\[@/[/g' -e 's/:\s*/=/g' filename

-f filename  将sed的动作写入到文件中


5.sed的一些其他的用法

 (1)\(pattern\)   

表示将‘正则表达式’匹配到的字符串保存起来,后面可以用\1,\2等依次引用。例如,

1,20s/\(you\)self/\1r/  标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。

(2)场景(1)中,变量\1代表\(\) 中pattern内容,而sed中&符号可以代表s/pattern//g中pattern中匹配的内容。1,20s/[you]self/[&]/ 表示将[you]self匹配到的字符串用中括号[]括起来。

(3)/pattern/的使用

例如删除空白行,sed '/^$/d' filename,其中的正则表达式pattern用//包含起来。有一个特殊的用法如下

sed -n '/01-10 00:30:/,/01-10 00:44:/p' access.log.2016011000  #将access日志中00点30 到 00点44之间的access日志打印出来。

(4)若直接修改文件内容有下面三种方式:

  • 使用-i选项
  • 不加-i选项,将sed操作后的标准输出重定向到一个单独文件,然后在mv
  • sed -i .bak 's/abc/def/g' filename      达到直接修改的文件的同时,将原文件备份到filename.bak文件中。没有试验成功,可能sed版本问题。待验证。
(5)当我想在sed的动作中使用变量时,需要将sed的动作的单引号改成双引号,然后在动作使用$var来引用变量,例如
text=Hello
echo Hello world | sed "s/$text/HELLO/g"

你可能感兴趣的:(数据处理工具之sed)