sed: -i选项直接保存修改的文件
/g 每一行替换
sed G # 在每一行后面增加一空行
sed '/^$/d;G' # 这样在输出的文本中每一行后面将有且只有一空行。
sed 'G;G' # 在每一行后面增加两行空行
sed '/regex/{x;p;x;}' # 在匹配式样“regex”的行之前插入一空行
sed '/regex/G' # 在匹配式样“regex”的行之后插入一空行
sed '/regex/{x;p;x;G;}' # 在匹配式样“regex”的行之前和之后各插入一空行
sed = filename | sed 'N;s//n//t/' # 为文件中的每一行进行编号(简单的左对齐方式)
sed -n '$=' # 计算行数 (模拟 "wc -l")
sed -e '1d' /etc/services | more 删除第一行
sed -e '1,10d' /etc/services 删除1至10行
sed -e '/^#/d' /etc/services 删除以#开始的行 (规则表达式地址总是由斜杠括起)
规则 表达式 描述
/./ 将与包含至少一个字符的任何行匹配
/../ 将与包含至少两个字符的任何行匹配
/^#/ 将与以 '#' 开始的任何行匹配
/^$/ 将与所有空行匹配
/}^/ 将与以 '}'(无空格)结束的任何行匹配
/} *^/ 将与以 '}' 后面跟有 零或多个空格结束的任何行匹配
/[abc]/ 将与包含小写 'a'、'b' 或 'c' 的任何行匹配
/^[abc]/ 将与以 'a'、'b' 或 'c' 开始的任何行匹配
sed -n -e '/BEGIN/,/END/p' /my/test/file | more
# 打印 BEGIN" 的行开始,并且以包含 "END" 的行结束的文本块 ; 请注意新的 '-n' 选项,该选项告诉 sed 除非明确要求打印模式空间,否则不这样做
sed -n -e '/main[[:space:]]*(/,/^}/p' sourcefile.c | more 打印 C 源文件中的 main() 函数
sed -e 's/.*/ralph said: &/' origmsg.txt 该例的替换字符串中使用了 '&' 字符,该字符告诉 sed 插入整个匹配的规则表达式
1,20{ s/[Ll]inux/GNU//Linux/g s/samba/Samba/g s/posix/POSIX/g }
上例将把三个替换命令应用到第 1 行到第 20 行(包括这两行)。还可以使用规则表达式地址或者二者的组合:
1,/^END/{ s/[Ll]inux/GNU//Linux/g s/samba/Samba/g s/posix/POSIX/g p }
将把 '{ }' 之间的所有命令应用到从第 1 行开始,到以字母 "END" 开始的行结束(如果在源文件中没发现 "END",则到文件结束)的所有行
替换-------------------------------------------------
sed -e 's/foo/bar/g' myfile.txt #在最后一个斜杠之后附加的 'g' 选项告诉 sed 执行全局替换
sed -e '1,10s/enchantment/entrapment/g' myfile2.txt #只在第一到第十行(包括这两行)上这样做
sed -e '/^$/,/^END/s/hills/mountains/g' myfile3.txt #只从空行开始,到以三个字符 'END' 开始的行结束(包这两行)的上这样做
sed -e 's:/usr/local:/usr:g' mylist.txt #关于 's///' 命令的另一个妙处是 '/' 分隔符有许多替换选项如":",把所有出现 的/usr/local 替换成 /usr
sed -e 's/<.*>//g' myfile.html #例myfile.html内容<b>This</b> is what <b>I</b> meant. 则输出meant.我们要的不是这个,而是:
This is what I meant. 则需要下面的处理
sed -e 's/<[^>]*>//g' myfile.html # '[^>]' 指定“非 '>'”字符,其后的 '*' 完成该表达式以表示“零或多个非 '>' 字符”。
字符类 描述:
'[a-x]*' 要指定字符范围,只要字符不在第一个或最后一个位置,就可以使用 '-',如下所示
'[a-x]*'
这将匹配零或多个全部为 'a'、'b'、'c'...'v'、'w'、'x' 的字符。
[:space:] 匹配空格
[:alnum:] 字母数字 [a-z A-Z 0-9]
[:alpha:] 字母 [a-z A-Z]
[:blank:] 空格或制表键
[:cntrl:] 任何控制字符
[:digit:] 数字 [0-9]
[:graph:] 任何可视字符(无空格)
[:lower:] 小写 [a-z]
[:print:] 非控制字符
[:punct:] 标点字符
[:space:] 空格
[:upper:] 大写 [A-Z]
[:xdigit:] 十六进制数字 [0-9 a-f A-F]
foo bar oni eeny meeny miny larry curly moe jimmy the weasel
现在假设要编写一个 sed 脚本,该脚本将把 "eeny meeny miny" 替换成 "Victor eeny-meeny Von miny" 等等。要这样做,首先要编写一个由空格分隔并与三个字符串匹配的规则表达式。
'.* .* .*'
现在,将在其中每个感兴趣的区域两边插入带反斜杠的圆括号来定义区域:
'/(.*/) /(.*/) /(.*/)'
除了要定义三个可在替换字符串中引用的逻辑区域以外,该规则表达式的工作原理将与第一个规则表达式相同。下面是最终脚本:
$ sed -e 's//(.*/) /(.*/) /(.*/)/Victor /1-/2 Von /3/' myfile.txt
如您所见,通过输入 '/x'(其中,x 是从 1 开始的区域号)来引用每个由圆括号定界的区域。输入如下:
Victor foo-bar Von oni Victor eeny-meeny Von miny Victor larry-curly Von moe Victor jimmy-the Von weasel
sed -n -e '=;p' myfile.txt #命令系列使用 '=' 命令和 'p' 命令,'=' 命令告诉 sed 打印行号,'p' 命令明确告诉 sed 打印该行(因为 处于 '-n' 模式)
sed -n -f mycommands.sed myfile.txt #sed -n -e '=' -e 'p' myfile.txt 然而,在使用更为复杂的附加和插入命令时,甚至多个 '-e' 选项也不能帮我们的忙。对于复杂的多行脚本,最好的方法是将命令放入一个单独的文件中。然后 用 -f 选项引用该脚本文件
一个地址的多个命令---------------------------------------------------------------
有时,可能要指定应用到一个地址的多个命令。这在执行许多 's///' 以变换源文件中的字和语法时特别方便。要对一个地址执行多个命令,可在文件中输入 sed 命令,然后使用 '{ }' 字符将这些命令分组,如下所示:
1,20{ s/[Ll]inux/GNU//Linux/g s/samba/Samba/g s/posix/POSIX/g } #把三个替换命令应用到第 1 行到第 20 行(包括这两行)。还可以 使用规则表达式地址或者二者的组合
1,/^END/{ s/[Ll]inux/GNU//Linux/g s/samba/Samba/g s/posix/POSIX/g p } #把 '{ }' 之间的所有命令应用到从第 1 行开始,到以字母 "END" 开始的行结束(如果在源文件中没发现 "END",则到文 件结束)的所有行
1i/ insert this line/ and this one/ and this one #在第1行前插入这段内容
如果要在当前行之前插入多行,可以通过在前一行之后附加一个反斜杠来添加附加行
1a/ insert this line after each line. Thanks! :) #在第1行后插入这段内容
附加命令的用法与之类似,但是它将把一行或多行插入到模式空间中的当前行之后
1c/ You're history, original line! Muhahaha! #将第1行替换成这段内容
更改行”命令将实际替换模式空间中的当前行
因为附加、插入和更改行命令需要在多行输入,所以将把它们输入到一个文本 sed 脚本中,然后通过使用 '-f' 选项告诉 sed 执行它们。使用其它方法将命令传递给 sed 会出现问题。