-
sed命令
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s) -
基本命令:
a 在当前行后面加入一行文本。
c 用新的文本改变本行的文本。
d 从模板块(Pattern space)位置删除行。
i 在当前行上面插入文本。
l 列表不能打印字符的清单。
n 从另一个文件中读文本下一行,并附加在下一行
p 打印模板块的行。
q 退出Sed。
r file 从file中读行。
w file 写并追加模板块到file末尾。
! 表示后面的命令对所有没有被选定的行发生作用。
y 表示把一个字符转换为另外的字符[^正则表达式]
= 打印当前行号码。
# 把注释扩展到下一个换行符以前。
s/re/string 用string替换正则表达式re。 -
元字符集:
^ 锚定行的开始,如:/^sed/匹配所有以sed开头的行
$ 锚定行的结束,如:/sed$/匹配所有以sed结尾的行
. 匹配一个非换行符的字符,如:/s.d/匹配s后接一个任意字符,然后是d
* 匹配零或多个字符,如:/ *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开头的单词的行
\> 锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行
x\{m\} 重复字符x,m次,如:/o\{5\}/匹配包含5个o的行
x\{m,\} 重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行
x\{m,n\}重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行
-
实例:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
a :在当前行后面加入一行文本。
追加命令:a命令
$ sed '1a drink tea' example #第一行后增加字符串
$ sed '1,3a drink tea' example #第一行到第三行每一行后增加字符串
$ sed '/^test/a drink tea' example #字符串被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。
注:a 插入的字符在当前行的下一行
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c: 用新的文本改变本行的文本。
替代:c命令
- $ sed '1c Hi' example #第一行替代为Hi
$ sed '1,3c Hi' example #第一行到第三行替代为Hi
$ sed '/test/c Hi' example #将含有test的行替代为Hi -
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
d :从模板块(Pattern space)位置删除行。
删除:d命令 - $ sed '2d' example #删除example文件的第二行。
$ sed '2,$d' example #删除example文件的第二行到末尾所有行。
$ sed '/^$/d' example #删除example文件的空行。
$ sed '/test/d' example #删除example文件所有包含test的行。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
i :在当前行上面插入文本。
插入:i命令
- $ sed '1i drink tea' example #第一行前增加字符串
$ sed '1,3i drink tea' example #第一行到第三行每一行前增加字符串
$ sed '/^test/i drink tea' example #字符串被追加到以test开头的行前面,sed要求命令a后面有一个反斜杠。
注:i 插入的字符在当前行的上一行
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
l 列表不能打印字符的清单。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
n: 从另一个文件中读文本下一行,并附加在下一行
读取下一行:n命令
-
sed '/test/{n;d}' example #删除test下面的一行
-
sed -n 'p;n' example #打印奇数行
- sed -n 'n;p' example #打印偶数行
- sed 'n;d' example #隔一行删除
- sed 'n;n;d' example #隔两行删除
注:n命令为将下一行的内容提前读入,并且将之前读入的行(在模式空间中的行)输出到屏幕,然后后续的命令会应用到新读入的行上。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
p :打印模板块的行。
打印:p命令
- $ sed -n '1p' example #打印example文件的第一行。
$ sed -n '$p' example #打印example文件的最后一行。
$ sed -n '2,$p' example #打印example文件的第二行到最后一行。
$ sed -n '/test/p' example
$ sed '/test/!d' example
注:通常 p 会与参数 sed -n 一起使用
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
q: 退出Sed。
退出:q命令
- $ sed '3q' example #打印完第3行后退出。(head –n )
$ sed '/test/q' example #查询到第一个test退出。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
r file :从file中读行。
从文件读入:r命令
- $ sed '/test/r file' example # file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
$ sed –e '/test/r file' –e '/test/d' example #添加后并删除包含test的行
$ sed '$r file' example #将file的内容放到example文件的最下面。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
w file: 写并追加模板块到file末尾。
写入文件:w命令
- $ sed -n '/test/w file' example
#在example中所有包含test的行都被写入file里。
$ sed -n 's/test/ok/g w file' example
#将test替换成ok后写入file里。
$ sed -n '/test/p' example > file
#也可以使用重定向写入功能
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
! :表示后面的命令对所有没有被选定的行发生作用。
地址限定-非:!
- $ sed '1!d' example # 不删除第一行(保留第一行)
$ sed '$!d' example # 不删除最后一行
$ sed '/test/!d' example #保留匹配行
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
y :表示把一个字符转换为另外的字符[^正则表达式]
转换命令:y命令 (y是一个管局命令,拒绝使用后缀/g)
- $ sed 'y/abcde/ABCDE/' example #把所有abcde转变为大写。
$ sed 'y/1234567890/abcdefghij/' example file #处理多个参数
注: y参数的替换时一一对应,两个字符串必须等长
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
= 打印当前行号码。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 把注释扩展到下一个换行符以前。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
s/re/string :用string替换正则表达式re。
替换:s命令
- $ sed 's/test/mytest/' example #每行第一个匹配的test被替换成mytest。
$ sed 's/test/mytest/g' example #在整行范围内把test替换为mytest。
$ sed -n 's/^test/mytest/p' example #如果某一行开头的test被替换成mytest,就打印它。
注:g 表示整个范围,没有g表示每一行的第一个
- $ sed 's/^[ \t]*//' example
#删除每一行开头的空白(空格、TAB)
$ sed 's/[ \t]*$//' example
#删除每一行最后的空格(空格、TAB)
$ sed 's/^[ \t]*//;s/[ \t]*$//' example
#删除每一行的开头和结尾的空格
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
多点编辑:e命令
- $ sed -e '1,5d' -e 's/test/check/' example #第一条命令删除1至5行,第二条命令用check替换test。
$ sed -e 's/yes/no/' -e 's/static/dhcp/' example
注:(-e)选项允许在同一行里执行多条命令
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
地址限定-限制行:逗号
- sed -n '/test/,/check/p' example
#所有在test和check所确定的范围内的行都被打印。 - sed -n '5,/^test/p' example
#打印从第五行开始到第一个以test开始的行之间的所有行。 - sed '5,6 s/1/2/g' example #将5-6行的所有1替换为2
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
分隔符:不论什么字符,紧跟着s命令的都被认为是新的分隔符,默认分隔符为“/”。
- $ sed 's#10#100#g' example
$ sed 's|10|100|g' example
$ sed 's:10:100:g' example
$ sed 's/\/bin/\/usr\/local\/bin/g' #分隔符出现在样式内部时,需要进行转义
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
已匹配字符串标记:&
#正则表达式 \w\+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词:
$ echo this is a test line | sed 's/\w\+/[&]/g'
[this] [is] [a] [test] [line]
#所有以192.168.0.1开头的行都会被替换成它自已localhost:
$ sed 's/^192.168.0.1/&localhost/' file
192.168.0.1localhost
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
子串匹配标记\1
$ echo aaa aaa| sed 's/aaa/BBB/1'
#第一个aaa替换BBB
$ echo aaa bbb| sed 's/\(aaa\) \(bbb\)/\2 \1/'
#将aaa 与 bbb的位置互换
$ sed -n 's/\(love\)able/\1rs/p' example
#love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
注:标记需要用()括起来
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
地址限定-限制行:逗号
$ sed -n '/test/,/check/p' example
#所有在test和check所确定的范围内的行都被打印。
$ sed -n '5,/^test/p' example
#打印从第五行开始到第一个以test开始的行之间的所有行。
$ sed '5,6 s/1/2/g' example #将5-6行的所有1替换为2
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
操作地址匹配
- $ sed –n ' 1~2p ' example #打印文件的奇数行
$ sed –n ‘ 2~2p ’ example #打印文件的偶数行
number 指定输入文件的唯一行
first~step 指定以first开始,并指定操作步长为step,如1、2指定第一行、第三行、第五行……为操作地址。2~5指定第二行开始,每5行匹配一次操作地址
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
当你需要执行多个指令时,可以使用以下三种方法:
- $ sed 's/yes/no/ ; s/static/dhcp/' example
#使用分号隔开指令
$ sed -e 's/yes/no/' -e ' s/static/dhcp/' example
#使用 -e 选项
$ sed '
> s/yes/no/
> s/static/dhcp/' example #利用分行 -
然而在命令行输入过长的指令是愚蠢的,这时需要-f选项指定sed脚本文件,在脚本文件中可以包含多行指令,而且也便于修改。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5.脚本:
Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
范例1:将文本中的第二个"<body>"替换为"</body>"
$ cat test.txt
<body>hello world<body>
$ cat sed.sh
/body/{
s//\/body/2
}
$ sed -f sed.sh test.txt
<body>hello world</body>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
范例2:给所有第一个的h1,h2等添加<>,第二个h1,h2添加</>
$ cat test.txt
h1Helloh1
h2Helloh2
$ cat sed.sh
/h[0-9]/{
s//\<&\>/1
s//\<\/&\>/2
}
$ sed -f sed.sh test.txt
<h1>Hello</h1>
<h2>Hello</h2>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
范例3:删除行中的空白行
$ cat test.txt
Hello 1
Hello 2
$ cat sed.sh
/.*/{
/^$/d
}
$ sed -f sed.sh test.txt
Hello 1
Hello 2
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
范例4:大小写转换
$ cat test.txt
hello 1
hello 2
$ cat sed.sh
/.*/{
y/hello/HELLO/
}
$ sed -f sed.sh test.txt
HELLO 1
HELLO 2
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6. sed高级应用
多行操作 Next
Next(N)指令通过读取新的输入行,并将它追加至模式空间的现有内容之后,来创建多行模式空间。模式空间的最初内容与新的输入行之间用换行符分隔。在模式空间中插入的换行符可以使用\n匹配。
注:与n命令不一样的地方是N命令并没有直接输出当前模式空间中的行,而是把下一行追加到当前模式空间,两行之间用回车符\n连接
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
范例1
$ cat test.txt
111
222
222
222
333
$ cat sed.sh
#n
/222/{
N
l
}
$ sed –f sed.sh test.txt
222\n222$
222\n333$
注:读取样本文件内容至模式空间,当读取的内容与222匹配时,立刻读取下一行内容,再输出模式空间中的内容,小写的l会打印非打印字符
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
范例2
$ cat test.txt
Name:Tom,
Mail:Tom@gmail.com,
Name:Jerry,
Mail:Jerry@gamil.com,
$ cat sed.sh
#n
/Name/{
N
L
}
L 打印(不显示非打印字符)
$ sed –f sed.sh test.txt
Name:Tom,Mail:Tom@gmail.com,
Name:Jerry,Mail:Jerry@gamil.com,
注:读取样本文件内容至模式空间,当读取的内容与Name匹配时,立刻读取下一行内容,再输出模式空间中的内容,#n 用来屏蔽自动输出
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7.GUN sed拓展
1)大小写切换:
\U # 小写 -> 大写
\u # 头母小写 -> 大写
\L # 大写 -> 小写
\l # 头母大写 -> 小写
$ echo 'abc' | sed 's/.*/\U&/'
ABC
$ echo 'abc' | sed 's/.*/\u&/'
Abc
$ echo 'ABC' | sed 's/.*/\L&/'
abc
$ echo 'ABC' | sed 's/.*/\l&/'
aBC
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2)/REGEXP/I 正则匹配忽略大小写
$ echo 'AbC' | sed -n '/abc/Ip'
AbC
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3) FIRST~STEP 取出奇数行或者偶数行
$ seq 10 | sed '0~2d'
1
3
5
7
9
$ seq 10 | sed '1~2d'
2
4
6
8
10
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4)每5行合并成1行,类似 xargs -n5
$ seq 20 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
$ seq 20 | sed ':a;N;s/\n/ /;0~5b;ba'
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5)\%REGEXP%
进行路径匹配时,使用此方法,可以剩去很多转义符\
$ echo 'a/b/c/d' | sed -n '/a\/b\/c\/d/p'
a/b/c/d
$ echo 'a/b/c/d' | sed -n '\%a/b/c/d%p'
a/b/c/d
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6)ADDR1,+N
地址 +行数,可以实现类似 grep -A N 的功能。
$ seq 10 | grep -A2 '5'
5
6
7
$ seq 10 | sed -n '/5/,+2p'
5
6
7
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++