sed 用来对文本进行过滤和替换操作,sed 可以通过一次兑取一行内容来对某些指令进行处理后输出,所以sed适合处理大数据文件。sed 默认不会直接修改源文件,而是将读入的内容复制到缓冲区中,这个缓存区被称之为“模式空间”,所有的指令操作都是在模式空间进行的,sed 默认输出至标准输入(屏幕上)。
sed 基本语法
sed 从文件中读取数据,如果没有输入文件,则默认对标准输入进程数据进行处理。脚本指令是第一个非”-“开头的参数,格式如下:
格式:sed [选项] {脚本命令} [输入文件]
选项:
* --version #显示sed的版本。
* -n,--silent #静默输出,该选项可以屏蔽自动打印到屏幕上。
* -e script #允许多个脚本指令被执行。
* -f script-file #从文件中读取脚本指令。
* -i #直接修改源文件。
* --posix #禁用GNU sed扩展功能。
* -r #在脚本指令中使用扩展正则表达式。
* -u #最低限度的缓存输入与输出。
sed 入门范例
脚本的基本格式
格式:
address{
command1
command2
command3
……
}
tips: 第一个命令可以跟左花括号在同一行,但是右花括号必须单独处一行。此外,命令后添加空格也会产生错误。
常用指令:
a 追加
s 替换
i 插入
d 删除
c 更改
y 按字符替换
p 打印
w 保存
r 读入文件内容
q 退出
demo1 :
sed '2a this is a demo' test.txt #在test文件的第二行追加文字。
sed '3i hello ' test.txt #在test文件的第三行插入文字。
sed 's/yes/no/g' test.txt #将文本中所有的yes替换成no。
sed '3,4d' test.txt #删除第3,4行的内容。
tip1.在实际工作中,大多数情况你并不确定操作对象(地址)的行号,更多的是用正则表达式确定操作对象(地址)。
demo2:
sed '/^$/d' test.txt #删除 文件中的空白行
tip2.我们也可以将命令写入到脚本文件,通过-f参数读取脚本文件。
demo3:
源文件test.html为:
<div>
<p>this is a demo page!</p>
h1helloh1
h2helloh2
h3helloh3
</div>
脚本sed.sh内容为:
/h[0-9]/{
s//\<&\>/1
s//\<\/&\>/2
}
执行:
sed -f sed.sh test.html
结果:
<div>
<p>this is a demo page!</p>
<h1>hello</h1>
<h2>hello</h2>
<h3>hello</h3>
</div>
ps :虽然sed可以利用” -e “参数一次执行多个命令,但是在实际工作中都是把多个命令放在脚本中,这样也便于修改。
tip3.操作对象(地址)的匹配范围。
每次在编写脚本的时候都需要指定一个地址来决定操作范围,如果不指定,默认对文件的所有行进行操作。有如下方式来确定操作范围:
number 指定具体的行号 如:sed '3d' test.txt
first~step 以first开始,并指定操作步长为step。 如:sed '1~2p' test.txt 打印奇数行
/regexp/ /……/中间是正则表达式。
\mregexpm \m与m 之间匹配正则表达式,m字符可以是任意字符替代。
num1,num2 指定行号范围。 如:sed '3,9d' test.txt 删除3~9行
num1,+N 匹配mun1以及后面的n行。