sed学习笔记 更新中...

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 会出现问题。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值