sed详解
之前,写过一篇grep正则表达式的文章。这篇记录下与grep命令具有类似相同功能的两个命令,sed和awk。grep是文本搜索工具,sed是非交互式流编辑器,awk是一种文本格式化工具。
sed是一个非交互式的流编辑器。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。
下面我们看一下sed的工作过程。
sed不是在原输入上直接进行处理的,而是先将读入的行放到缓冲区中,对缓冲区里的内容进行处理,处理完毕后也不会写回原文件(除非用shell的输出重定向来保存结果),而是直接输出到屏幕上。sed运行过程中维护着两个缓冲区,一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holding space)”。一般情况下,每当运行sed,sed首先把第一行装入模式空间,进行处理后输出到屏幕,然后将第二行装入模式空间替换掉模式空间里原来的内容,然后进行处理,以此类推。
如图:
sed命令格式sed [OPTION]... {script-only-if-no-other-script} [input-file]...
OPTION:-r: 支持扩展正则表达式;
-n: 静默模式;
-e script1 -e script2 -e script3:指定多脚本运行;
-f /path/to/script_file:从指定的文件中读取脚本并运行;
-i: 直接修改源文件;
地址定界:#: 指定行;
$: 最后一行;
/regexp/:任何能够被regexp所匹配到的行;
\%regexp%:同上,只不过换作%为regexp边界符;
startline,endline==#,#:从startline到endline
#,/regexp/:从#行开始,到第一次被/regexp/所匹配到的行结束,中间的所有行;
/regexp1/,/regexp2/:从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到的行结束,中间的所有行;
#,+n:从#行开始,一直到向下的n行;
first~step:指定起始行,以及步长;
sed的编辑命令d: 删除模式空间中的行;
=:显示行号;
a\text:附加text
i\text:插入text,支持\n实现多行插入;
c\text:用text替换匹配到的行;
p: 打印模式空间中的行;
s/regexp/replacement/:替换由regexp所匹配到的内容为replacement;g: 全局替换;
w /path/to/somefile:把指定的内容另存至/path/to/somefile路径所指定的文件中;
r /path/from/somefile:在文件的指定位置插入另一个文件的所有内容,完成文件合并;
例子:
一、OPTIONS
1、sed默认使用参数-e,如果不指定“定界位置符”默认读取文件所有行,不指定对文件的操作命令,默认为打印p。[root@centos bash]#
[root@centos bash]# sed '' a.sh
#!/bin/bash
read -p "plz enter two integer:" -t 20 num1 num2
while [ $num1 != $num2 ];do
if [ $num1 -gt $num2 ];then
poor=$[$num1-$num2]
num1=$poor
elif [ $num2 -gt $num1 ];then
poor=$[$num2-$num1]
num2=$poor
fi
done
echo $poor
[root@centos bash]# sed -e '' a.sh
#!/bin/bash
read -p "plz enter two integer:" -t 20 num1 num2
while [ $num1 != $num2 ];do
if [ $num1 -gt $num2 ];then
poor=$[$num1-$num2]
num1=$poor
elif [ $num2 -gt