参考文章:《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 讲》。



















