Sed用法

Sed是非交互式的行编辑器. 它即可以从stdin中接收文本输入, 也可以从文件中接收文本输入, 它对输入中的指定行进行特定的操作, 一行操作一次, 然后将结果输出到stdout, 或输出到文件中. 在shell脚本中使用的话, sed通常都是作为管道工具链中的一个处理部分来使用.

Sed会决定它需要处理那些行, 因为sed的参数就包含有地址范围. [1] 既可以通过行号来指定地址范围, 也可以通过模式匹配来决定地址范围. 比如, 3d表示sed会删除输入的第3行, /windows/d表示sed会删除掉所有匹配"windows"的输入行.

对于sed工具包的所有操作来说, 我们最关心的其实就是3个最主要的操作. 分别是printing(打印到stdout), deletion(删除), 和substitution(替换).


表格 C-1. 基本sed操作

操作符名字效果
[地址范围]/p打印打印[指定的地址范围]
[地址范围]/d删除删除[指定的地址范围]
s/pattern1/pattern2/替换将指定行中, 将第一个匹配到的pattern1, 替换为pattern2.
[地址范围]/s/pattern1/pattern2/替换地址范围指定的每一行中, 将第一个匹配到的pattern1, 替换为pattern2.
[地址范围]/y/pattern1/pattern2/transform地址范围指定的每一行中, 将pattern1中的每个匹配到pattern2的字符都使用pattern2的相应字符作替换. (等价于tr命令)
g全局在每个匹配的输入行中, 将每个模式匹配都作相应的操作. (译者注: 不只局限于第一个匹配)

 

 

除非在替换命令的后边明确指定选项g(全局), 否则的话, 替换操作只会替换掉每行上的第一个模式匹配实例.

如果在命令行或脚本中使用这个命令, sed操作可能还需要某些选项和引用.

  1 sed -e '/^$/d' $filename
  2 # -e选项, 将会使得后边的字符被看作为编辑指令. 
  3 #  (如果只给"sed"传递了单个指令, 那么"-e"是可选的.)
  4 #  "强"引用('')将会保护指令中的RE(正则表达式)字符串, 
  5 #+ 也就是防止脚本将RE重新解释为特殊字符. 
  6 # (这会为sed命令, 保存指令的RE表达式.)
  7 #
  8 # 将会对文件$filename中的文本进行操作. 

在某些特定的情况下, sed编辑命令将不会和单引号的强引用一起工作.

  1 filename=file1.txt
  2 pattern=BEGIN
  3 
  4   sed "/^$pattern/d" "$filename"  # 工作正常. 
  5 # sed '/^$pattern/d' "$filename"    就会出现异常的结果. 
  6 #        在这个实例中, 被强引用(' ... ')引起的
  7 #+      "$pattern"就不会扩展为"BEGIN". 

 

 

Sed命令的-e选项表示后续的字符串是一个指令, 或指令集. 如果后续的字符串中只有一个指令, 那么-e选项可以被省略.

  1 sed -n '/xzy/p' $filename
  2 # -n选项会让sed只打印那些匹配模式的行. 
  3 # 否则所有的输入行都会被打印. 
  4 # 这里可以省略-e选项, 因为这里只有一个编辑指令. 


表格 C-2. sed操作符举例

表示法效果
8d删除输入的第8行.
/^$/d删除所有空行.
1,/^$/d从输入的开头一直删除到第1个空行(第一个空行也删除掉).
/Jones/p只打印那些包含"Jones"的行(使用-n选项).
s/Windows/Linux/在每个输入行中, 将第一个出现的"Windows"实例替换为"Linux".
s/BSOD/stability/g在每个输入行中, 将所有"BSOD"都替换为"stability".
s/ *$//删除掉每行结尾的所有空格.
s/00*/0/g将所有连续出现的0都压缩成单个的0.
/GUI/d删除掉所有包含"GUI"的行.
s/GUI//g将所有"GUI"都删除掉, 并保持剩余部分的完整性.

在输入行中, 将一个字符串替换为空字符, 等价于删除这个字符串. 剩余部分会保持完整. 比如s/GUI//, 拿下边这句为例:

The most important parts of any application are its GUI and sound effects
结果为:
The most important parts of any application are its  and sound effects

反斜线将会强制sed替换命令延续到下一行. 类似于, 在第一行的结尾使用换行作为替换字符串.

  1 s/^  *//
  2 /g
这将每行开头的空格用换行来替换. 最后的结果就是将每段的缩进替换为一个空行.

地址范围后边可以加上一系列操作, 这些操作可能需要放到大括号对中, 并且需要重起一行.

  1 /[0-9A-Za-z]/,/^$/{
  2 /^$/d
  3 }
这只会删除连续空行中的第一行. 对于单行间距的文本文件来说, 这很有用, 但是会保留段落间的空行.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值