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

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


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

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


(4)定界符/

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

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

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

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


(5)删除

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


(6)引用

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

test=hello
sed "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 line
sed -i "2a this is a test line" test.conf
# 在文件最后一行后追加一行数据bye
sed -i '$a bye' file
# OR
sed -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 line
sed -i '5i this is a test line' test.conf


(13)匹配单词

# 匹配包含以wo为开头的单词所在的行
sed -n '/\/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为开头的行替换成它自己加上localhost
sed -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)在最后一个前添加

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


你可能感兴趣的:(Shell)