参考文章:《Shell 编程–Sed》
cat /etc/redhat-release
看到操作系统是CentOS Linux release 7.6.1810
,uname -r
看到内核版本是3.10.0-957.el7.x86_64
,bash --version
可以看到bash
版本是4.2.46(2)
。
echo 'a : 1 : good ::::' >> sedplustest.txt
echo 'b : 2 : well ::::' >> sedplustest.txt
echo 'c : 3 : food ::::' >> sedplustest.txt
echo 'd : 4 : hood ::::' >> sedplustest.txt
echo 'e : 5 : bell ::::' >> sedplustest.txt
echo 'o : 6 : toll ::::' >> sedplustest.txt
使用上边的命令,把下边的内容:
a : 1 : good ::::
b : 2 : well ::::
c : 3 : food ::::
d : 4 : hood ::::
e : 5 : bell ::::
o : 6 : toll ::::
写入到sedplustest.txt
,cat sedplustest.txt
看一下sedplustest.txt
文件里边的内容。
全局替换
sed
默认只处理模式空间第一次匹配的字符串,sed 's/:/!/' sedplustest.txt
可以看到只把每行第一处:
替换成了!
,而每行第二处:
没有任何改变,可以看到执行sed 's/:/!/' sedplustest.txt
之后,sedplustest.txt
里边的内容没有任何改变。
sed 's/:/!/g' sedplustest.txt
会把每行中所有的:
都替换成!
,而sedplustest.txt
文件的内容没有改变。
标志位
sed s/oldstring/newstring/标志位
,标志位可以是如下的内容:
数字,表示第几次匹配替换。
g
,就像上边全局替换的效果
p
,进行打印
sed -n ‘command’ [FILE]…,会抑制打印
w file
,将模式空间内容输出到file
中。
数字
sed 's/:/!/2' sedplustest.txt
可以把每行第2
次匹配的:
改成!
。
sed 's/:/!/6' sedplustest.txt
可以把每行第6
次匹配的:
改成!
。
p打印
sed 's/a/!/p' sedplustest.txt
会把匹配到内容的一行重复打印。
sed 's/a/!/' sedplustest.txt
不管是否匹配到内容,都会输出每一行。sed -n 's/a/!/' sedplustest.txt
不管是否匹配到内容都不会输出一行。sed -n 's/a/!/p' sedplustest.txt
会把匹配内容的一行输出。p
命令最好结合-n
选项使用。
模式空间内容输出w file
sed -n 's/a/!/w record.txt' sedplustest.txt
会把匹配到的第一处内容a
替换成!
,然后输出到record.txt
里边。
sed -n 's/a/!/pw testpw.txt' sedplustest.txt
会把匹配到的第一处内容a
替换成!
,然后输出到屏幕上和testpw.txt
文件里。
sed -n 's/:/!/gpw testgpw.txt' sedplustest.txt
会把匹配到的每行所有内容:
替换成!
,然后输出到屏幕上和testgpw.txt
文件里。
寻址
寻址格式有以下格式:
/正则表达式/s/oldstring/newstring/标志位
行号s/oldstring/newstring/标志位
,可以使用$
表示最后一行
行号和正则表达式混用
/正则表达式/s/oldstring/newstring/标志位
sed '/^e/s/:/!/' sedplustest.txt
可以把以e
开头的一行先匹配,然后把已经匹配的行第一处匹配的:
改成!
。
行号s/oldstring/newstring/标志位
sed '3s/:/!/' sedplustest.txt
可以把第3行先匹配,然后把已经匹配的行第一处匹配的:
改成!
。
行号和正则表达式混用
sed '/^e/,6s/:/!/' sedplustest.txt
会匹配以e
开始的行到第6
行,然后把已经匹配的行第一处匹配的:
改成!
。
分组
就是使用正则表达式匹配之后,执行多条命令,比如/正则表达式/{s/oldstring/newstring/标志位;s/oldstring/newstring/标志位
。
sed -n '/^e/{s/:/!/;s/e/a/2p}' sedplustest.txt
可以把以e
开始的行先匹配上,然后把匹配上的行先把第一处匹配的:
改成!
,然后再把第二处匹配的e
改成a
。
sed脚本文件
echo '3s/:/!/' > sfile.sed
把3s/:/!/
写入到sfile.sed
中,然后sed -f sfile.sed sedplustest.txt
使用sfile.sed
的内容作为命令操作sedplustest.txt
,把第三行的第一处匹配到的:
替换成!
。
此文章为8月Day 8学习笔记,内容来源于极客时间《Linux 实战技能 100 讲》。