Sed文本处理工具
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sed文本处理工具相关的知识,希望对你有一定的参考价值。
本章思维导图:
一、Sed概述
1、Sed定义:
Sed(Stream EDitor)行编辑器,Sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲 区中,称为“模式空间”,接着用sed命令处理“模式空间”中的内容,处理完成后,默认情况下会把“模式空间”的内容 送往标准输出(这时如果“模式空间”中内容的最后一行没有换行符,会在输出的时候自动添加一个换行符 )。然后读取 下行,执行下一个循环(如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间), 这样不断重复相同的操作,直到文件末尾;文件的内容并没有改变,除非你使用重定向存储输出。
2、功能:
使用sed可以实现:数据的替换、删除、新增等,这里的数据可以是一些关键字,也可以是一些特定的行。
3、模式空间和保留空间:
4、grep、vim与sed相比的区别:
grep:grep是根据给定的条件来检索关键字,而sed是搜索、匹配、处理文本的工具
vim:vim是一种交互式的文本编辑工具,而sed是一种非交互式的文本编辑器,通过给定的条件自动的逐行去处理文件
二、命令的模式:
1、编辑命令模式:
1)语法:sed [options] 'command' file(s)
2)command部分的用法:
(1)语法:[地址1] [地址2] [函数] [参数]
关键点:
command部分在编辑命令的模式下必须用单引号保护起来
一个或者两个地址是可以省略的
可以用任何目的空白或者Tab地址和函数分开
函数必须出现
依据给出的是哪个函数,标志可能是是必需的或者可选的(?)
引用shell变量时要使用双引号,而不是单引号
(2)地址定界:数字:
#:#表示数字,指定第#行
例:sed '1d' test3.txt
表示删除test3.txt文件中的第1行
#1,#2:指定从第#1行到第#2行,以逗号分隔
例:sed '1,3d' test3.txt
表示删除test3,txt文件中的1-3行
#~i:从第#行开始,步长为i,直到结束
例:1~2:所有的奇数行
2~2:所有的偶数
#,+n:从第#行开始,一直到向下的n行后结束
正则表达式:
/pattern/:能被此模式匹配到的每一行
例1:sed '/Barry/d' test3.txt
删除test3.txt文件中包含“Barry”的行
例2:sed '/^Susan/d' test3.txt
删除test3文件中以“Susan”开头的行
/pattern1/,/pattern2/:从模式1匹配到的行开始一直到模式2匹配到的行结束,以逗号分隔
例:sed '/western/,/southeast/d'
删除包含“western的行和包含“southeast”的行之间的所有行(包含“western的行和含“southeast”的行这两行也删除)
组合使用
#,/pattern/:从第#行开始到能被此模式能匹配到的行结束
/pattern/,#:从能被此模式能匹配到的行开始到第#行结束
例:sed '1,/western/d' test3.txt
删除第一行到包含“western”的行之间的所有行
特殊用法:
$:用在地址定界中表示文件的最后一行
例:sed '1,$d' test3.txt
表示删除test3.txt文件中1行到最后一行之间的所有行
!:表示取反
例:sed '1!d' test3.txt
表示删除test3.txt文件中除了第一行之外的所有行
(3)函数用法标准用法:
插入、修改、删除(标准用法)
a[\]:在当前被匹配到的行的下面加入一行,支持\n实现多行追加
例1:sed '/Barry/a\hello,world' test3.txt
在当前被匹配到的行的下面加入一行“hello,world”
例2sed '/Barry/a\hello\nworld' test3.txt
在当前被匹配到的行的下面分别加入两行,hello和world
c[\]:用新文本替换当前匹配行的文本内容,支持\n实现多行追加
例1:sed '/Barry/c\hello,world' test3.txt
用“hello,world”替换当前匹配到的行
例2:sed '/Barry/c\hello\nworld' test3.txt
分别用hello和world两行替换当前的行
i[\]:在当前被匹配到的行的上面加入一行,支持\n实现多行追加
例1:d '/Barry/i\hello,world' test3.txt
在当前被匹配到的行的上面加入一行“hello,world”
例2:sed '/Barry/i\hello\nworld' test3.txt
在当前被匹配到的行的上面分别加入两行,hello和world
d:删除当前匹配到的行
例:sed '/Barry/d' test3.txt
删除包含“Barry”的行
查找和替换
s:用一个字符串替换另一个字符串
s函数的语法格式:[地址1],[地址2]s<模式><替换><标志>
<模式>、<替换>、<标志>之间可以用不是换行符的其他符号作为分隔符,默认用/
<模式>:匹配到的要进行替换的关键字或者行,支持正则和扩展正则
如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
如果是对单行进行完全匹配,一般会使用正则表达式匹配一整行
例1:基名:echo /etc/init.d/functions | sed -r '[email protected]*/([^/]+/?)@\[email protected]'
取/etc/init.d/functions路径的基名
例2:目录名:echo /etc/init.d/functions | sed -r '[email protected](/.*/)[^/]+/[email protected]\[email protected]'
取/etc/init.d/functions路径的目录名
<替代>:要用来替代原有内容的字符串
在<替代>中有特殊意义的字符:
&:调用<模式>中匹配到的字符串
\#:在<模式>中使用\(\)分组之后,在<替代>中调用分组中的第#个字符串
<标志>:对替换行为要执行的一些操作
g:全文进行替换,默认只对匹配到的行的第一个匹配字符串进行替换
p:如果替换成功,打印出替换成功的行
w:如果替换成功,将替换成功的行写入一个文件
保存和取回
h:把“模式空间”中的内容拷贝一份覆盖至“保留空间”
例:sed '/Barry/h;$G' test3.txt 或者 sed -e '/Barry/h' -e '$G'
把test3.txt文件中包含“Barry”的一行放置在文件的做后一行
H:把“模式空间”中的内容拷贝一份追加至“保留空间”
例:
g:把“保持空间”的内容拷贝一份并覆盖至”模式空间“
例:sed ‘g’ test1.txt
将test1.txt文件中的每行内容替换为空行
G:把“保持空间”的内容拷贝一份追加至“模式空间”
例:sed ‘G’ test1,txt
在test1.txt文件的每行后加一个空行
x:交换 “模式空间”和“保持空间”的内容
输入和输出(标准用法)
p:将匹配到的行打印出来
例:sed '/1111/p
将包含1111的行打印出来
r:从文件中读取输入行
例:sed '/1111/r test3.txt' test1.txt
从test.txt文件中匹配到包含1111的行就读入文件test3.txt中
w:将匹配到的行写入文件
例:sed '[email protected]@[email protected]g;wtest4' test1.txt
将test1,txt文件中的1111替换为abcd之后将新内容写入新文件test4中
=:为“模式空间”中的行打印行号
例:sed '[email protected]@[email protected];=' test1.txt
将test1文件中的1111替换为abcd后,将每一行的行号打印出来,行号是在每一行内容的上方
控制流:
!:对所匹配到的行以外的所有行执行操作
例:sed '$!N;$!D' test1.txt
仅显示test1.txt文件的最后两行
{}:组合命令
一组命令作为一个模块而被应用
函数命令之间用分号分隔组合可以嵌套n:读取匹配到的行的下一行覆盖至模式空间,对这一行执行命令操作,而不是对匹配到的行执行操作。例:sed 'n;p' test1.txt输出test1.txt文件中的奇数行高级用法多行输入:N:把匹配到的行的下一行追加至模式空间中,并与在模式空间中的第一行(即匹配到的行)共同创建一 个多行模式空间。第一行与第二行之间会生成一个换行符。sed将第一行与第二行共同看作一个有很多嵌入行的整行,并会对整行执行后面的操作。与n函数相比,n函数在于它输出模式空间内容,然后读取新行,并不建立多行模式空间。
例:sed 'N;[email protected]\[email protected]\[email protected]' test1.txt
将文件test1.txt文件中的的n和n+1行合并为一行,中间用Tab分隔(n为奇数行)。
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模 式空间重新启动循环。
如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环
例:sed 'N;D' test.txt
仅显示test1.txt文件的最后一行
P:多行Print和print稍有不同。它输出多行模式空间的第一部分,直到第一个嵌入的换行符。
因此,当默认输出被抑制或脚本的控制流更改,以至于不能到达脚本底部的时候,需要使用打印命令P或者p。Print命令经常出现在Next和Delete命令之前。这三个命令能够建立一个输入输出循环,用来维护两行的模式空间,但是一次只输出一行, 然后返回到脚本的顶端将所有命令应用于模式空间的第二行。没这个循环,当执行到脚本的最后一个命令的时候,模式空间这两行将被输出。
多个函数综合使用
在多个函数多个函数连续使用的时候,函数之间需要用分号分隔的时候
3)options(命令行选项)
-n:不输出所有默认输出的行,只输出p函数或者在s函数后p标志所指定的行。
-e:允许多项编辑;多个命令均在模式空间的当前行上执行;命令的顺序会影响结果。
例:sed -e '1,3d' -e 's/western/southeast/'
-i:直接修改目标文件
例:sed .orig 's/Barry/Zhanghan' test3(?)
-f 下一个参数为sed脚本的脚本名,后面再跟上的参数才是要处理的文件名,sed脚本中是一行一个的sed编辑命令。
例:sed -f Test1.sh test3.txt
-r:支持扩展正则
2、脚本模式:
1)语法:sed [options] -f scriptfile file(s)
2)sed script的规则:
脚本的实质是一个sed命令的清单。
在命令的末尾不能有任何空白或者文本。
如果在一行中有多个命令要用分号分隔。
不需要且不能用引号保护命令。
对以#开头的注释行不能进行跨行(?)。
脚本实例:
#!/bin/bash
/western/,/southeast/{
/^[[:space:]]*$/d
/Susan/{h;d}
}
/Ann/g
s/TB\(Savage\)/hahaha \1/
Test1,sh
以上是关于Sed文本处理工具的主要内容,如果未能解决你的问题,请参考以下文章