最近的学习都集中在研究sed和gawk这两个命令行文本编辑程序的使用上,终于今天把这个内容告一段落了,今天最后再把这两个编辑器的深入的使用经验学习一下。
sed高阶
①多行命令
★ N:在数据流中添加下一行以创建用于处理的多行组。
★ D:删除多行组中的单行。
★ P:打印多行组中的单个行。
首先我们来区分一下,单行命令n和多行命令N。简单的说,n就是讲sed继续执行的位置跳到了匹配的数据流的下一行,而N就是把匹配数据流的下一行合并到上一行,构成一个段落文本。
例如:
$ cat data1
this is a boy
this is a man
boy this
$ sed '/boy/{
> n
> d
> }' data1
this is a boy
boy this
$ sed '
> s/boy this/man is/
> N
> s/boy this/man is/
> ' data
this is a man is is a man
man is
★ 将单行命令移动到N命令前,使得文本末尾行的文本能够被修改,要不然在N命令下会忽略最后一行的文本。
多行删除命令D:删除模式空间中的第一行。
多行打印命令P:打印模式空间中的第一行。
例如:
$ cat data2
this is a question
is bad
question is bad
$ sed '
> N
> /question\nis/D
> ' data2
is bad
question is bad
$ sed '
> N
> /question\nis/P
> ' datd2
this is a question
②保留空间
模式空间: 是一个活动的缓冲区,它在sed编辑器处理命令时保留被检查的文本。sed也可以利用另一个成为保留空间的缓冲区。其主要命令如下:
命令 | 描述 | 命令 | 描述 |
---|---|---|---|
h | 将模式空间复制到保留空间 | G | 将保留空间追加到模式空间 |
H | 将模式空间追加到保留空间 | x | 将模式空间和保留空间交换 |
g | 将保留空间复制到模式空间 |
③否定命令
感叹号(!)用于否定命令。
例如:
$ sed -n '/header/!p' data1 #打印data中除了含有header的余下所有行
④更改命令流
分支命令(b)的格式为:
[address]b [label]
:label #接下来定义标签内容
简单来说可以归纳为定义地址来执行所规定的标签内的新的内容。
测试命令(t)的格式为:
[address]t [label]
:label #接下来定义标签内容,也可以将标签命令直接写在t 的后面
简单来说可以归纳为测试命令是当前面的替换命令成功匹配以后就执行测试命令。类似if-then的简单方式。
⑤模式替换
与号(&):用于表示替换命令中的匹配模式。
例如:
$ echo "The cat sleeps in his hat." | sed 's/.at/".at"/g'
The ".at" sleeps in his ".at".
$ echo "The cat sleeps in his hat." | sed 's/.at/"&"/g'
The "cat" sleeps in his "hat".
$ echo "The cat sleeps in his hat." | sed 's/sleep \(.n\)/\1/'
The cat in his hat. #用转义的括号标注子字符串元素,用\n指定第几个元素
⑥sed的一些小技巧
删除文本中的空行,并且为每行间添加空行,最后一行不加。
$ sed '/^$/d;$!G' data
删除连续的空行
$ sed '/./,/^$/!d' data
删除开头的空行
$ sed '/./,$!d' data
删除结尾空行
$ sed '{
:start
/^\n*$/{$d; N; b start}
}'
对文件中的行计数
$ sed '=' data | sed 'N; s/\n/ /'
1 This
2 hello
删除HTML标记
$ sed 's/<[^>]*>//g' data