?经常使用,但有些总记不全,有时候经常查找,这次全部捋清楚做备忘,有需要的小伙伴欢迎收藏起来哦!
查、增、改、删一应俱全,非常详细!
目录
注意,下面每条指令中最后的a是文件名。
sed -n '2p' a
sed -n '2,3p' a
sed -n -e "1p" -e "3p" a
sed -n '2,$p' a
上面指令中引号也可以去掉。
如下,查看文件中包含hello的行:
sed -n '/hello/p' a
或使用awk完成:
awk '/hello/' a
如下,查看文件中包含hello的行的行数:
sed -n '/hello/p' a |wc -l
也可以grep实现:
grep -c "hello" a
如仅替换每行第一个出现的123
sed 's/123/abc/' a
全局替换每行的指定内容为新内容:
sed 's/123/abc/g' a
如按每行从第2个出现时开始进行替换:
sed 's/123/abc/2g' a
如下,即替换第3行~第5行内容中的123为abc
sed '3,5s/123/abc/g' a
当然,如果只想替换第3行~第5行中每行第一个123,则去掉g就可以了。
如第1行、第3行:
sed -e '3s/123/x/g' -e '11s/123/x/g' a
或
sed -e '3s/123/x/g;11s/123/x/g' a
上述案例中/是定界符,该符号可自行设置,如我想换成用#定界:
sed 's#123#abc#2g' a
换定界符可实现,如下将/替换为x:
sed 's#/#x#g' a
如果不换定界符,就是要用\来替换含有\等符号的字符串,怎么办?
如将文件中斜杠、反斜杠替换为x,结果都一样:
sed 's/\/x/g' a
sed: -e expression #1, char 7: unterminated `s' command
sed 's///x/g' a
sed: -e expression #1, char 5: unknown option to `s'
如此会报错。那怎么解决?看方案2.
对于要替换的内容有斜杠的,用反斜杠转义即可成功:
sed 's/\//x/g' a
如果反斜杠要替换,则也用反斜杠转义:
sed 's/\\/x/g' a
如下,将文件中的所有斜杠、反斜杠均替换为x:
sed 's/\//x/g;s/\\/x/g' a
sed -i 's/\//\\/g' a
即都用反斜杠转义即可。
如下,将双引号替换为x,其中双引号要用反斜杠\转义:
sed -i 's#\"#x#g' a
如下,将单引号替换为x,其中外围的一对单引号需换为双引号,和里面不要交叉即可:
sed -i "s#'#x#g" a
但是,如果是引号换为另一种引号呢?如将单引号替换为双引号:
sed -i "s#'#\"#g" a
即,双引号用\转义即可成功。
sed -e?
解决办法:用分号;隔开
举例如替换文件中123为x,替换456为y:
sed 's/123/x/g;s/456/y/g' a
字符c用来操作指定行,如1c指的是第一行,1,3c就是第1行~第3行
将第1行完整替换为x
sed -i '1c x' a
将第1、2行的所有内容完整替换为x
sed -i '1,2c x' a
此时效果是原来的第1、2行消失,被替换为了x,相当于文件整体少了一行。
(注意并不是把第1、2行每行都各自替换为x哦)
将第1、2行的每行内容都替换为x
方法1
sed -i '1c x' a | ?sed -i '2c x' a
即用管道符连接多个行操作。
方法2
不使用c,使用正则+替换的办法来实现:
sed -i '1,2s/.*/x/g' a
如果是不相连的两行,如第1行、第3行:
sed -i -e '1s/.*/x/g' -e '3s/.*/x/g' a
或
sed -i -e '1s/.*/x/g;3s/.*/x/g' a
如原内容为[a] = 1,替换为a = 1
sed -i "s#\[a\] = 1#a = 1#g" a
下面都是操作a文件。
sed '1,3ax' a
如文件a内容是:
hello
hello.hello
12345123
操作后变为6行:
hello
x
hello.hello
x
12345123
x
sed -i 'ax' a
sed -i '1s/$/x/' a
sed -i '2s/^/x/' a
sed -i 's/$/x/' a
awk '{print $0"x"}' a
或
awk '$0=$0"x"' a
注意,此操作(awk)不会实际修改文件。
注意:下述操作如果只想操作后打印出来而不是真正修改文件,则去掉 -i参数即可。
主要是用d字符删除。
sed -i '/^$/d' a
如删除第1行
sed -i '1d' a
删除最后一行
sed -i '$d' a
删除第2行到第3行
sed -i '2,3d' a
删除第2行到尾行
sed -i '2,$d' a
删除所有以hello开头的行
sed -i '/^hello/d' ?
删除所有包含hello的行
sed -i '/hello/'d a
-e选项允许在同一行里执行多条命令。
举例如:将第1行替换为x、将文件中123替换为x,将456替换为y,且上述所有操作实际修改到文件
sed -i -e '1c x' -e 's/123/x/g;s/456/y/g' a
可以看到,不同的操作用-e指定,多个替换直接可以在一个-e内完成并可以用分号连接。
-r来指定目标文件。如下,用b文件的内容替换a文件中的所有123
sed -i '/123/r b' a
sed 's/^ //g' a
注意,此时仅删除每行开始的第一个空格,如果某行开头有多个空格只会删除第一个。
如要要删除每行前所有空格:
sed 's/^[ ]*//' a
文件a内容如下:
#cat a
?aaa
? bbb
-ccc
?ddd
?- eee
操作起来:
sed -i 's/^[ -]*//' a
再次查看:
#cat ccc
aaa
bbb
ccc
ddd
eee