sed基础操作

sed:流式编辑器

可以针对每行输入处理,也可以将修改应用到文件中

ll | sed '1a hello'
sed '1a hello' test.txt

如上两种方式可以将ll命令的输入的第一行后面增加hello输出,也可以将test.txt文件中第一行后面增加hello输出,这种输入不会影响源文件,因为sed读取标准输入,然后在指定位置多加一行输出而已。如果要编辑,可以使用-i参数

假如使用命令行的输出作为sed的标准输入

ll
total 0
drwxr-xr-x. 2 jiang jiang 179 Jun 28 10:07 Desktop
drwxr-xr-x. 3 jiang jiang 114 May 17 15:07 Documents
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Downloads
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Music
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Pictures
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Public
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Templates
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Videos

插入

a:after

i:in front

ll | sed '1a hello'     或者     ll | sed 1a\hello    或者     ll | sed 1ahello

ll | sed '1a hello'
total 0
hello
drwxr-xr-x. 2 jiang jiang 179 Jun 28 10:07 Desktop
drwxr-xr-x. 3 jiang jiang 114 May 17 15:07 Documents
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Downloads
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Music
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Pictures
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Public
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Templates
drwxr-xr-x. 2 jiang jiang   6 Apr 10 00:14 Videos

ll | sed '1i hello'  输入到第一行前面,

ll | sed '$a hello' 最后一行插入

ll | sed /do/Iia 不区分大小写匹配do的行,行后插入字符a,大写的i表示不区分大小写匹配,小写的i表示行前插入,

删除

ll | sed 2,3d 删除第2到第3行,3不是表示3行,而是第三行

ll | sed /do/Id 删除不区分大小写匹配do的行,大写的i是不区分大小写匹配,小写的i是行前插入

更多匹配方式可以参照正则表达式

替换

替换字符串
ll | sed 's/m/g/i' 不区分大小写,将第一个m替换为字符g

ll | sed 's/m/g/gi' 不区分大小写,将所有m替换为g

s/待替换的字符串/新字符串/ 这种格式中 / 作为分隔符并不是一定的,当使用s命令时候,我们可以使用别的分隔符,实际上s后面紧接着的字符就是分隔符,所以不一定是 / 符号
ll | sed 's#m#g#gi'

test.txt中有如下内容

a11 aa
11 aa
22 bb
33 mm
zz aa
/root/data/test abc


将data/替换为haha\,其中/需要转义,使用\转义
sed 's/data\//haha\\/' test.txt
显示:

a11 aa
11 aa
22 bb
33 mm
zz aa
/root/haha\test abc

斜杠太凌乱可以用#做分隔
sed 's#data\/#haha\\#' test.txt

替换整行:

sed 1ci_am_replaced test.txt 或者 sed '1c  i_am_replaced' test.txt

c表示整行,1c表示替换第一行

sed 1ci_am_replaced test.txt
i_am_replaced
11 aa
22 bb
33 mm
zz aa
/root/data/test abc

sed /aa/Ici_am_replaced test.txt

c表示替换整行,/aa/Ic表示不区分大小写匹配aa所在行

sed /aa/Ici_am_replaced test.txt
i_am_replaced
i_am_replaced
22 bb
33 mm
i_am_replaced
/root/data/test abc

搜索

sed -n '/a/p' test.txt

sed -n '/a/p' test.txt
a11 aa
11 aa
zz aa
/root/data/test abc

匹配/a/的行输出,其实就是打印出来而已,如果不带-n参数,就是打印原来的东西,然后把匹配的行再次打印

sed '/a/p' test.txt
a11 aa
a11 aa
11 aa
11 aa
22 bb
33 mm
zz aa
zz aa
/root/data/test abc
/root/data/test abc

所以所谓搜索,只是单纯打打印匹配行。

编辑文件

上述所有流式编辑都是打印出来而已,并没有对文件执行本质修改,要修改文件需要加-i参数

sed -i '/a/d' test.txt
cat test.txt
22 bb
33 mm

可见,文件中/a/匹配的行的确被删除了,更多匹配方式,参考正则表达式

混合操作

一次执行多条指令,用分号隔开

cat test.txt
id=123
name=hello
age=12

------------------------------------------------
sed '/^\s*id=/!d;s/\s*id=//' test.txt
123

如上实现配置文件解析,

/^id=/匹配id开头的行
/^id=/!匹配不以id开头的行
/^id=/!d删除不以id开头的行
/^\s*id=/!d删除不以若干个空白+id开始的行,过滤行前的空白
;开始下一操作
s/a/b/将本行中的a替换成b
s/a//将本行中的a替换成空
s/\s*id=//将   id=    和    id=之前的所有空白字符     替换成空,不要使用s/\s*id=//g,带参数g会替换所有的

sed还有其他一些高级指令D,p,P,h,H等,可以从man sed中查看

小贴士:

使用sed命令时可能需要配合其他命令使用,

str=hello
echo ${#str}

echo ${#string}可以输出字符串长度,string替换为自己需要获取长度的变量名

发布了275 篇原创文章 · 获赞 46 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/youyudexiaowangzi/article/details/93974048
今日推荐