sed命令的用法

sed命令的详细学习:

 

Sed的常用选项:

-n:只显示sed匹配到的行。其余行不显示。

-i :可以直接操作原文件。默认情况下sed不会改变原文件,但是-i选项可以修改原文件,此选项应慎用。

-r:可以使用标准正则表达式。默认情况下sed只支持基本正则表达式,但是加上-r选项后则支持扩展正则表达式

-e:多脚本共用。可以同时执行多个命令。

 

 

 

 

常见的用法(格式):

替换操作:s命令

sed -e 's/原来的内容/要替换的内容/g' 文件名 

sed -i 's/原来的内容/要替换的内容/g'  文件名 

 

追加操作:a命令(追加的指定内容的后面)
在第一行的后面追加一行
sed -i 1a\xiaochao x.txt

 

在每行的头添加字符,比如"HEAD",命令如下:

sed 's/^/HEAD&/g' test.file

在每行的行尾添加字符,比如“TAIL”,命令如下:

sed 's/$/&TAIL/g' test.file

1."^"代表行首,"$"代表行尾

2.'s/$/&TAIL/g'
s代表替换字符串,(c代表替换整行)
g代表每行出现的字符全部替换(如果想在特定字符处添加,g就有用了,否则只会替换每行第一个,而不继续往后找了)
加上g跟不加g的区别:
 
加上-i跟不加-i的区别:
 

 

sed -n 's/root/ROOT/p' sed.txt                          sed替换结合-n选项和p命令,只显示改动过的行


sed -i '$a\要插入的文字' file.txt                   在文件的结尾插入一行文字

sed -i '1 i\sed command start' myfile                  行首添加一行
sed -i '$a \sed command end' myfile                   行尾追加一行
sed -e '14s/yes/no/g'  /etc/xinetd.d/tftp               将此文件的14行的yes换成no

 

sed -e 's/^/#/g' php_install.sh     将 每行开头都添加上#号

 

 

删除操作:d命令

1.删除空白行

sed '/^$/d' passwd.txt == sed -i '/^$/d' passwd.txt

sed -e '/^$/'d passwd.txt(d放‘ ’外边也可以)

sed -e '/^$/d' passwd.txt

cat passwd.txt|grep -v "^$")此命令也可以

2.删除文件第二行

sed -e '2d' passwd.txt

3.删除文件第3行到末尾(包括第三行)

sed -e '3,$d' passwd.txt

sed -i '2,$d' x.txt 

4.删除文件的最后一行

sed -e '$d' passwd.txt

5.删除文件中所有以oldboy开头的行

sed -e '/^oldboy/'d passwd.txt

6.删除文件中所有以nologin结尾的行

sed -e '/nologin$/'d passwd.txt

7.删除文件中以o开头的行

sed -e '/^o,*/d' passwd.txt

8.删除文件中以n结尾的行

sed -e '/n,*$/d' passwd.txt

9.删除第1行到第44行

sed -e '1,44d' passwd.txt

 

 sed命令升华:

 

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。 $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。 . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。 * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。 [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。 [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。 & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。 \< 匹配单词的开始,如:/\ 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。 x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。 x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。 x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。

来自: http://man.linuxde.net/sed
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。 $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。 . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。 * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。 [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。 [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。 & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。 \< 匹配单词的开始,如:/\ 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。 x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。 x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。 x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。

来自: http://man.linuxde.net/se

已匹配字符串标记&

正则表达式\w匹配每一个字母,使用&替换它,&对应之前所匹配到的字母。

echo "thisisatestline"|sed 's/\w/& /g'
t h i s i s a t e s t l i n e

正则表达式\w\+匹配每一个单词,使用&替换它,&对应之前所匹配到的单词。

echo "this is a test line"|sed 's/\w\+/& /g'
this  is  a  test  line

echo "this is a test line"|sed 's/\w\+/[&]/g'
[this] [is] [a] [test] [line]

 

附加方法:

echo "asdfghjkl"|sed -e 's/\(.\)/\1 /g'

将每个单词都加上双引号
echo this is a test line|sed 's/\w\+/“&”/g'
“this” “is” “a” “test” “line”
在以root开头的

sed -e 's/^root/&_localhost/g' passwd.txt |grep root
root_localhost:x:0:0:root:/root:/bin/bash

11.sed 命令分组匹配分隔

解释:\(.\) 里面有几个点就是已几个字符为一组

\1#:这个就是1后面是什么就以什么为分隔符

以每个字符为分隔后面加上空格

[root@www ~]# echo "asdfghjklqwertyuiopzxvcbnm"|sed 's/\(.\)/\1 /g'
a s d f g h j k l q w e r t y u i o p z x v c b n m

以每2个字符为分隔后面加上空格

[root@www ~]# echo "asdfghjklqwertyuiopzxvcbnm"|sed 's/\(..\)/\1 /g'
as df gh jk lq we rt yu io pz xv cb nm

以每3个字符为分隔后面加上空格
[root@www ~]# echo "asdfghjklqwertyuiopzxvcbnm"|sed 's/\(...\)/\1 /g'
asd fgh jkl qwe rty uio pzx vcb nm

以#号为分隔符分隔每个字符

echo "asdfghjklqwertyuiopzxvcbnm"|sed 's/\(.\)/\1#/g'  
a#s#d#f#g#h#j#k#l#q#w#e#r#t#y#u#i#o#p#z#x#v#c#b#n#m#

以空格为分隔符按照4242的方式分隔

ed -e 's/\(....\)\(..\)/\1 \2 /g' sed.txt|head -n1
root :x :0:0 :r oot: /r oot: /b in/b as h

12.子串匹配标记\1

echo aaa BBB|sed 's/\([a-z]\+\)/\1/'
aaa BBB

echo aaa BBB|sed 's/\([a-z]\+\) \([A-Z]\+\)/\1/'
aaa

echo aaa BBB|sed 's/\([a-z]\+\) \([A-Z]\+\)/\1 \2/'

aaa BBB

echo aaa BBB|sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
BBB aaa

13.

 

14.

 

15.

16.

17.

18.

19.

20.

posted @ 2017-08-30 11:10  肖咏卓  阅读(4984)  评论(0编辑  收藏  举报