Shell脚本——使用sed命令编辑文本

来源:互联网 发布:网络课程网站 编辑:程序博客网 时间:2024/06/07 04:27

1 语法格式

sed [-nefri] 'command' file(s)


2 常用选项

-n   只显示sed处理后的结果,而非全部显示

-e   对相同文件进行多项编辑

-f   执行-f后接文件中的sed操作,可直接将sed操作写在一个文件中

-r   

-i   直接修改读取的文件,而非在屏幕上输出,否则只打印而不写入文件


3 常用命令

a   新增,后接的字符串在选定行的下一行插入

i   插入,后接的字符串在选定行的上一行插入

c   取代,后接的字符串替换掉选定行

d    删除,后不接字符串

p    列印,打印模板块的行,常与-n参数连用,表示只打印sed处理后的行

s    取代,替换制定字符串,常搭配正则表达式

=    打印行号


4 sed替换标记

g        行内全部替换

p        打印行

w        把行写入一个文件

r        在行后读入一个文件

&        已匹配字符串标记

\1        子串匹配标记,\2, \3, ...


5 元字符集

^        匹配行首,如/^sed/表示匹配所有以sed为开头的行

$        匹配行尾,如/sed$/表示匹配所有以sed为结尾的行

.        匹配一个非换行符的任意字符,如/s.d/表示匹配s后接任一字符且最后是d的行

*        匹配0个或多个字符,如/*sed/表示匹配以sed为结尾的行

[]        匹配指定范围内的一个字符,如/[sS]ed/表示匹配sed或Sed的行

[^]        匹配不在指定范围内的一个字符,如/[^A-RT-Z]ed/表示匹配不包含A-R和T-Z的一个字符开头,紧跟ed的行

&        保存搜索字符、替换其他字符,如s/love/**&**/表示love编程**love**

\<        匹配单词的开头

\>        匹配单词的末尾

x\{m\}        重复字符x、m次

x\{m,\}        重读字符x至少m次

x\{m,n\}        重复字符x至少m次、至多n次


6 例子

(1)定址

用于确定对哪些进行编辑;

地址形式可以是数字、正则表达式或两者的结合;

若没有指定行,sed处理输入文件的所有行;

x 行号

x,y 行号范围从x到y

/pattern/ 查询包含模式的行


# 打印包含my的行到包含your的行之间的行sed -n '/my/,/your/p' file# 打印第二行到最后一行之间的行sed -n '2,$p' file# 打印包含$的所有行sed -n '/\$/p' file


(2)替换一行中某部分s

# 替换第一个ruby为birdsed -i 's/ruby/bird/' file# 全面替换ruby为birdsed -i 's/ruby/bird/g' file# 替换2个或多个空格为1个空格sed -i 's/[ ][ ]*/ /g' file# 从第2个匹配处开始替换ruby为birdsed -i 's/ruby/bird/2g' file# 在每行行首添加HEADsed -i 's/^/HEAD&/g' file# 在每行行尾添加TAILsed -i 's/$/&TAIL/g' file


(3)替换一行或多行c\

# 替换第一、二行为HIsed -i '1,2c HI' file


(4)定界符/

根据需要使用定界符,推荐一直使用,更清晰;

通常使用"/"作为定界符,也可使用任意定界符;

若定界符出现在样式中,需转义;

# 全面替换\bin为\usr\local\binsed 's/\/bin/\/usr\/local\/bin/g' file


(5)删除

# 删除空白行sed '/^$/d' file# 删除所有以test为开头的行sed '/^test/d' file


(6)引用

sed表达式可使用单双引号来引用,但若表达式包含变量,只能使用双引号;

test=hellosed "s/${test}/HELLO/" file


(7)选定行的范围,

# 模板test和west之间的行,每行末尾使用字符串aa bb替换sed '/test/,/west/s/$/aa bb/' file


(8)多点编译

sed -e "1,5d" -e "s/test/check/" file


(9)从文件读入r

# 读取file内容,显示在与test相匹配行的下一行,若匹配多行,file内容显示在所有匹配行的下一行sed '/test/r file' filename


(10)写入文件w

# 在filename中所有包含test的行被写入file中,以覆盖的形式sed -n '/test/w file' filename


(11)追加(行下)a

# 多行追加到以test为开头的行后面sed -i '/^test/a this is a test line\nthis is a test line' file# 在test.conf文件的第2行之后插入this is a test linesed -i "2a this is a test line" test.conf# 在文件最后一行后追加一行数据byesed -i '$a bye' file# ORsed -i "\$a bye" file


(12)追加(行上)i

# 将this is a test line追加到以test为开头的行前面sed -i '/^test/i this is a test line' file# 在test.conf文件第5行之前插入this is a test linesed -i '5i this is a test line' test.conf


(13)匹配单词

# 匹配包含以wo为开头的单词所在的行sed -n '/\<wp/p' file# 匹配包含以ld为结尾的单词所在的行sed -n '/ld\>/p' file


(14)匹配连续字符的行

# 匹配包含连续3个b的行sed -n '/b\{3\}/p' file# 匹配至少包含连续1个c的行sed -n '/c\{1,\}/p' file# 匹配包含2到4个d的行sed -n '/d\{2,4\}/p' file


(15)已匹配字符串标记&

# 所有以192.168.0.1为开头的行替换成它自己加上localhostsed -n 's/^192.168.0.1/&localhost/p' file# 在export PATH=之后添加:$PYTHON_HOME/lib(相当于在指定行某位置插入数据!)sed -i "s/export PATH=/&\$PYTHON_HOME\/lib:/g" file


(16)子串匹配标记\1

# 所有loveable替换成lovers,并打印sed -n 's/\(love\)able/\1rs/gp' file# 两个子串互换位置echo aaa BBB | sed -n 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'


(17)在最后一个</bean>前添加<bean>

# 首先获取最后一个</bean>所在行号line=sed -n '/</bean>/=' file | tail -n 1# 在该行最前面添加<bean>sed -i '${line}s/.*/<bean>&/' file


0 0
原创粉丝点击