Shell脚本——使用sed命令编辑文本
Posted twc829
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 '/\\<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为开头的行替换成它自己加上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)在最后一个</bean>前添加<bean>
# 首先获取最后一个</bean>所在行号
line=sed -n '/</bean>/=' file | tail -n 1
# 在该行最前面添加<bean>
sed -i '$lines/.*/<bean>&/' file
以上是关于Shell脚本——使用sed命令编辑文本的主要内容,如果未能解决你的问题,请参考以下文章