sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
sed命令:
文本处理三剑客:
grep;egrep;fgrep:文本过滤器
sed:Stream EDitor,流编辑器,行编辑器;
awk:文本格式化工具,报告生成器
sed [OPTION]… {script-only-if-no-other-script}[input-file]…
地址定界编辑命令
常用选项:
-n:不输出模式空间中的内容至屏幕;
-e script, –expression=script:多点编辑;
-f /PATH/TO/SED_SCRIPT_FILE
-r, –regexp-extended:支持使用扩展正则表达式:
-i [SUFFIX], –in-;lace[=SUFFIX]:直接编辑原文件;
地址定界:
(1)不给地址:对全文进行处理;
(2)单地址:
#:指定行
/pattern/:被此模式所匹配到的每一行
(3)地址范围;
#,#
#,+#
#,/patl/
/patl/,/pat2/,…
$: 最后一行
(4)步进:~
1~2:所有奇数行
2~2:所有偶数行
编辑命令:
d:删除
p:显示模式空间中的内容
a \text: 在行后面追加文本“text”,支持使用\n实现多行追加;
i \text:在行前面插入文本“text”,支持使用\n实现多行插入;
c \text: 把匹配到的行替换为此处指定的文本“text”;
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;即文件合并;
=:为模式匹配到的行打印行号;
!:条件取反; 地址定界!编辑命令;
s///:查找替换:其分隔符可自行指定,常用的有s@@@,s###等;
替换标记:
g:全局替换
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中
p:显示替换成功的行
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行至模式空间中;
N:追加读取匹配到的行的下一行至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
示例:
sed -n ‘n;p’ FILE:显示偶数行;
sed ‘1!G;h;$!d’ FILE:逆序显示文件内容;
sed ‘$!d’ FILE:取出最后一行;
sed ‘$!N;$!D’ FILE:取出文件最后两行;
sed ‘/^$/d;G’ FILE:删除原有的所有空白行,
而后为所有的非空白行后添加一个空白行;
sed ‘n;d’ FILE:显示奇数行;
sed ‘G’ FILE: 在原有的每行后方添加一个空白行;
基本sed编程举例:
使用p(rint)显示行: sed -n ‘2p’ temp.txt 只显示第2行,使用选项n
打印范围: sed -n ‘1,3p’ temp.txt 打印第1行到第3行
打印模式: sed -n ‘/movie/’p temp.txt 打印含movie的行
使用模式和行号查询: sed -n ‘3,/movie/’p temp.txt 只在第3行查找movie并打印
显示整个文件: sed -n ‘1,$’p temp.txt $为最后一行
任意字符: sed -n ‘/.*ing/’p temp.txt 注意是.*ing,而不是*ing
打印行号: sed -e ‘/music/=’ temp.txt
附加文本:(创建sed脚本文件) chmod u+x script.sed, 运行时 ./script.sed temp.txt
#!/bin/sed -f
/name1/ a/ #a/表示此处换行添加文本
HERE ADD NEW LINE. #添加的文本内容
插入文本: /name1/ a/ 改成 4 i/ 4表示行号,i插入
修改文本: /name1/ a/ 改成 /name1/ c/ 将修改整行,c修改
删除文本: sed ‘1d’ temp.txt 或者 sed ‘1,4d’ temp.txt
替换文本: sed ‘s/source/OKSTR/’ temp.txt 将source替换成OKSTR
sed ‘s//$//g’ temp.txt 将文本中所有的$符号全部删除
sed ‘s/source/OKSTR/w temp2.txt’ temp.txt 将替换后的记录写入文件temp2.txt
替换修改字符串: sed ‘s/source/”ADD BEFORE” &/p’ temp.txt
结果将在source字符串前面加上“ADD BEFORE”,这里的&表示找到的source字符并保存
sed结果写入到文件: sed ‘1,2 w temp2.txt ‘ temp.txt
sed ‘/name/ w temp2.txt’ temp.txt
从文件中读文本: sed ‘/name/r temp2.txt’ temp.txt
在每列最后加文本: sed ‘s/[0-9]*/& Pass/g’ temp.txt
从shell向sed传值: echo $NAME | sed “s/go/$REP/g” 注意需要使用双引号
快速一行命令:
‘s//.$//g’ 删除以句点结尾行
‘-e /abcd/d’ 删除包含abcd的行
‘s/[][][]*/[]/g’ 删除一个以上空格,用一个空格代替
‘s/^[][]*//g’ 删除行首空格
‘s//.[][]*/[]/g’ 删除句号后跟两个或更多的空格,用一个空格代替
‘/^$/d’ 删除空行
‘s/^.//g’ 删除第一个字符,区别 ‘s//.//g’删除所有的句点
‘s/COL/(…/)//g’ 删除紧跟COL的后三个字母
‘s/^////g’ 删除路径中第一个/
原创文章,作者:MFX,如若转载,请注明出处:http://www.178linux.com/74549