《Linux命令行与Shell脚本编程大全》第二十一章:sed进阶
- 2023-05-05 10:00:00
- 胡方舟
- 原创 573
1. 多行命令
1.1 next命令
- 单行next命令
- 小写的n命令会告诉sed编辑器移动到数据流中的下一文本行,而不用重新回到命令的最开始再执行一遍。
单行next命令会将数据流中的下一文本行移动到sed编辑器的模式控件中
- sed '/aaaa/{n ; d}' data1.txt
- 小写的n命令会告诉sed编辑器移动到数据流中的下一文本行,而不用重新回到命令的最开始再执行一遍。
- 合并文本行
- 多行文本的next命令(大写N)会将下一文本行添加到模式空间中已有的文本后
- 如果用N匹配的数据在数据流中的最后一行,那就不会匹配到,所以要写两种模式,一个匹配单行一个匹配多行。单行在N命令前,多行在N命令后
- sed '
s/System Administrator/Desktop User/
N
s/System\nAdministrator/Desktop\nUser/
' data2.txt
- sed '
- 如果用N匹配的数据在数据流中的最后一行,那就不会匹配到,所以要写两种模式,一个匹配单行一个匹配多行。单行在N命令前,多行在N命令后
- 多行文本的next命令(大写N)会将下一文本行添加到模式空间中已有的文本后
1.2 多行删除命令
- 如果用N搭配单行删除命令(d)来使用,会将匹配到的行都删掉
- 如果N搭配多行删除命令(D)来使用,该命令只会删除到换行符为止的所有字符
1.3 多行打印命令
- 多行打印命令(P)只打印多行模式空间中的第一行,包括模式空间中知道换行符为止的所有字符
2. 保持空间
- h: 将模式空间复制到保持空间
- H: 将模式空间附加到保持空间
- g: 将保持空间复制到模式空间
- G: 将保持空间附加到模式空间
- x: 交换模式空间和保持空间的内容
3. 排除命令
- 感叹号(!)命令用来排除命令 sed -n '/header/!p' data2.txt
4. 改变流
4.1 分支
- 格式:[address]b [label]
- [address] :地址、地址模式或者地址区间
- [label]:定义要跳转的位置,如果没有这个参数,跳转命令会跳转到脚本的结尾,以冒号开头,最多七个字符
- sed '{/first/b :jump1 ; s/This is the/No jump on/
:jump1
s/This is the/Jump here on/}' data2.txt
- sed '{/first/b :jump1 ; s/This is the/No jump on/
4.2 测试
- 格式:[address]t [label]
- 如果替换命令成功匹配并替换了一个模式,测试命令就会跳转到指定的标签
- 如果没有指定标签,测试成功之后,就会跳转到脚本的结尾
- sed '{
s/first/second/
t
s/This is the/No match on/
}' data.txt- 如果第一个替换命令成功执行了,那么就不会执行第二条替换命令
5. 模式替代
5.1 &字符
- 不管模式匹配到的是什么样的文本,都可以在替代模式中使用&符号来使用这段文本
- 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/.at/"&"/g'
- 用圆括号来定义替换模式中的子模式
- 可以使用特殊字符来引用每个子模式, 如\1, \2
- 当在替换命令中使用圆括号时,必须用转义字符将它们标示为分组字符而不是普通的圆括号。这跟转义其他特殊字符正好相反
- echo "The furry cat is pretty." | sed 's/furry \(.at\)/\1/'
> The cat is pretty.
- echo "The furry cat is pretty." | sed 's/furry \(.at\)/\1/'
6. 在脚本中使用sed
6.1 使用包装脚本
6.2 重定向sed的输出
- 可以在脚本中使用$() 将sed编辑器命令的输出重定向到一个变量中
7. 创建sed实用工具
7.1 加倍行间距
- sed 'G' data.txt
- 启动sed编辑器时,保持空间只有一个空行,将它附加到已有行后面,你就在已有行后面创建了一个空白行
- 这样的话,文件末尾也会附加一个空白行
- sed '$!G' data.txt
- 只要该行不是最后一行,G命令就会附加保持空间内容。这样最后就不会多一个空行了
7.2 对可能含有空白行的文件加倍行间距
- sed '/^$/d ; $!G' data.txt
- 先删除空白行,然后附加空白行
7.3 给文件中的行编号
- sed '=' data.txt | sed 'N ; s/\n/ /'
7.3 打印末尾行
- sed '{
:start
$q ; N ; 11,$D
b start
}' data.txt
7.5 删除行
- 删除连续的空白行
- sed '/./,/^$/!d' data.txt
- 区间是/./ 到 /^$/。区间的开始地址会匹配任何含有至少一个字符的行,区间的结束地址会匹配一个空行,在这个区间内的行不会被删除
- sed '/./,/^$/!d' data.txt
- 删除开头的空白行
- sed '/./,$!d' data.txt
- 这个区间是从含有字符的行开始,一直到数据流结尾,在这个区间内的任何行都不会从输出中删除
- sed '/./,$!d' data.txt
- 删除结尾的空白行
- sed '{
:start
/^\n*$/{$d ; N ; b start}
}' data.txt
- sed '{
8. 删除HTML标签
- sed 's/<[^>]*>//g' data.txt
暂时没有记录