Sed各种操作,以及shell脚本变量内插

在写各种script的时候,或者系统命令的时候,总少不了文本处理,天天在各种编程语言之间环绕,有些常用的处理方法还是总结下,以免生疏

LiHui@GodLike ~/work
$ cat lihui.txt
##################################
#number
123
#word
onetwothree
#match
1:one 2:two 3:three
#json
{"1":"one", "2":"two", "3":"three"}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

1:将某行或者某些行打印出来,-n配合p

LiHui@GodLike ~/work
$ sed -n '5p' lihui.txt
onetwothree

LiHui@GodLike ~/work
$ sed -n '$p' lihui.txt
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

LiHui@GodLike ~/work
$ sed -n '2, 9p' lihui.txt
#number
123
#word
onetwothree
#match
1:one 2:two 3:three
#json
{"1":"one", "2":"two", "3":"three"}

LiHui@GodLike ~/work
$ sed -n 'p' lihui.txt
##################################
#number
123
#word
onetwothree
#match
1:one 2:two 3:three
#json
{"1":"one", "2":"two", "3":"three"}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

2:删除某行或者某些行,带上d

LiHui@GodLike ~/work
$ sed '3d' lihui.txt
##################################
#number
#word
onetwothree
#match
1:one 2:two 3:three
#json
{"1":"one", "2":"two", "3":"three"}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

LiHui@GodLike ~/work
$ sed '2, $d' lihui.txt
##################################

3:全部匹配输出满足匹配内容的行,正则表达式匹配即可

LiHui@GodLike ~/work
$ sed -n '/one/p' lihui.txt
onetwothree
1:one 2:two 3:three
{"1":"one", "2":"two", "3":"three"}

LiHui@GodLike ~/work
$ sed -n '/\#/p' lihui.txt
##################################
#number
#word
#match
#json

4:匹配出关心的内容,然后需要二次处理进行替换,通过s和g

LiHui@GodLike ~/work
$ sed -n '/one/p' lihui.txt | sed 's/1/100/g'
onetwothree
100:one 2:two 3:three
{"100":"one", "2":"two", "3":"three"}

LiHui@GodLike ~/work
$ sed -n '/\#/p' lihui.txt | sed 's/\#/\?/g'
??????????????????????????????????
?number
?word
?match
?json

5:指定的位置,或者指定内容后面添加行,通过a

LiHui@GodLike ~/work
$ sed '1a How are you' lihui.txt
##################################
How are you
#number
123
#word
onetwothree
#match
1:one 2:two 3:three
#json
{"1":"one", "2":"two", "3":"three"}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

LiHui@GodLike ~/work
$ sed '1, 2a How are you' lihui.txt
##################################
How are you
#number
How are you
123
#word
onetwothree
#match
1:one 2:two 3:three
#json
{"1":"one", "2":"two", "3":"three"}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

LiHui@GodLike ~/work
$ sed '1a How\nare\nyou' lihui.txt
##################################
How
are
you
#number
123
#word
onetwothree
#match
1:one 2:two 3:three
#json
{"1":"one", "2":"two", "3":"three"}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

LiHui@GodLike ~/work
$ sed '/json/a How are you' lihui.txt
##################################
#number
123
#word
onetwothree
#match
1:one 2:two 3:three
#json
How are you
{"1":"one", "2":"two", "3":"three"}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

6:直接修改文件内容,全剧替换,而不是将处理的信息打印出来,-i

LiHui@GodLike ~/work
$ sed -i 's/\#/%/g' lihui.txt

LiHui@GodLike ~/work
$ cat lihui.txt
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%number
123
%word
onetwothree
%match
1:one 2:two 3:three
%json
{"1":"one", "2":"two", "3":"three"}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

LiHui@GodLike ~/work
$ sed -i '/%/d' lihui.txt

LiHui@GodLike ~/work
$ cat lihui.txt
123
onetwothree
1:one 2:two 3:three
{"1":"one", "2":"two", "3":"three"}

LiHui@GodLike ~/work
$ sed -i '/}/a From lihui' lihui.txt

LiHui@GodLike ~/work
$ cat lihui.txt
123
onetwothree
1:one 2:two 3:three
{"1":"one", "2":"two", "3":"three"}
From lihui

LiHui@GodLike ~/work
$ sed -i '/}/ s/\"//g' lihui.txt

LiHui@GodLike ~/work
$ cat lihui.txt
123
onetwothree
1:one 2:two 3:three
{1:one, 2:two, 3:three}
From lihui

7:最后有一点要注意的,这里的sed命令都是在命令行执行的,要修改的内容都是直接写出来,假如是通过shell脚本来替换,一定要注意单引号和双引号

下面这个例子,可以看到shell脚本并没有达到one=》four的替换

LiHui@GodLike ~/work
$ cat lihui.txt
123
onetwothree
1:one 2:two 3:three
{1:one, 2:two, 3:three}
From lihui

LiHui@GodLike ~/work
$ cat hello.sh
#!/bin/bash

one=one
four=four
myfile=lihui.txt

sed -i 's/$one/$four/g' $myfile

LiHui@GodLike ~/work
$ sh hello.sh

LiHui@GodLike ~/work
$ cat lihui.txt
123
onetwothree
1:one 2:two 3:three
{1:one, 2:two, 3:three}
From lihui

但是将shell脚本里的单引号修改成双引号,就大功告成了,也就是shell里,跟perl是一样的,双引号才能变量内插,单引号还是当作字符串的

LiHui@GodLike ~/work
$ cat hello.sh
#!/bin/bash

one=one
four=four
myfile=lihui.txt

sed -i "s/$one/$four/g" $myfile

LiHui@GodLike ~/work
$ sh hello.sh

LiHui@GodLike ~/work
$ cat lihui.txt
123
fourtwothree
1:four 2:two 3:three
{1:four, 2:two, 3:three}
From lihui

而命令行里,通过下面sed命令显然是可以直接替换的

$ sed -i 's/one/four/g' lihui.txt

发表回复