用户工具


sed语法

sed [全局参数] '[定址1][,定址2] [操作符] [;[定址1][,定址2] [操作符]]'


常用参数搭配

sed 's/a/b/g'  ——> 常用于输出重定向生成新的文件
sed 不加参数,且[操作符]不为p时,默认输出修改后的文本:

sed -n 's/a/b/g p' ——> 常用于打印匹配行
-n:静默状态,默认无任何打印,当[操作]为p时,打印匹配到的行。 -n 和 p 常常一起连用

全局参数详解

  • -n : 静默状态,阻止输入行的自动输出 (常用)
  • -i : 将执行结果写会文件 (常用)
  • -r : 使用扩展的正则表达式 (常用)
  • -e : 执行随后指令 (不常用)

定址符

定址符可以是一个(指定某一行),也可以是二个(指定某一个范围)

  • 定址符是一个的情况
    1. 数字 (指定某一行)
    2. 正则表达式 (匹配到的行)
    3. $ (最后一行)
  • 定址符是二个的情况
    1. 二个整数,如1,3(第一行到第三行)
    2. 二个正则表达式,如/^aa/,/bb$/(第一个以aa开头的行到第一个以bb结尾的行)
    3. 一个整数一个正则表达式,如2,/^aa/(第二行到,第二行之后的第一个以aa开头的行。如果找不到那,会从第二行直接删到最后)
    4. 也可以和 $ 搭配使用

sed中所有出现正则表达式的地方都要用/ /包起来


操作符

  • i : 在匹配行之前插入一个字符串
    1. sed '1 i hello word'(在第一行之前插入hello word,允许有空格)
  • a : 在匹配行之后插入一个字符串
    1. sed '1 a hello word'(在第一行之后插入hello word,允许有空格)
  • d : 删除匹配的行
    1. sed '1 d' (删除第一行)
    2. sed '1 !d' (删除所有行,除了第一行)
  • c : 替换整行
    1. sed '1 c hello word' (第一行换成hello word)
  • s : 用新的字符串替换旧的字符串
    1. sed 's/旧字符串/新字符串/' (替换匹配行中第一次出现的地方)
    2. sed 's/旧字符串/新字符串/g'(替换匹配行中所有出现的地方)
    3. sed -n 's/旧字符串/新字符串/g p'(替换匹配行中所有出现的地方,并打印出来)
  • p : 打印匹配到的行
    1. sed -n '1 p'(打印第一行)
    2. sed -n '1 !p'(打印除了第一行)

只有操作符 s 和操作符 p 能连用, 操作符i,a,d均不能与操作符号 p 连用

  • q : 退出
  • n : 读取匹配行的下一行
  • N : 读取匹配行和下一行
  • I : 忽略大小写
    1. sed -n '/AbC/I p'
  • = : (=号表示打印行号)
    1. * sed -n '/abc/ =' (打印包含abc字符串行号)

高级用法

  • sed -r '1 s/12(.)90/\1/g'
    • 这个命令的作用是用第一个变量代替整个字符串
    • 扩号中的内容是一个变量,第一个括号中的内容是\1,第二个是\2。
    • 使用这个高级语法是要加-r(支持扩展的正则表达式)
  • sed 's/XYZ/'“$value”'/' (使用变量)
  • sed -n '2 {s/a/1/g;s/b/2/g;p}' (大括号将多条命令组合成一条)
    • 这里要注意一下和sed -n '2 s/a/1/g;s/b/2/g;p命令的区别。在有大括号的情况下,所有语句共享前面的限定条件。如果没有大括号,只有s/a/1/g会被限定在第二行,而s/b/2/g;p对每一行都有效。
  • if else,这里要用到b(branch)命令
/abc/b jump_tag #如果匹配到abc则跳转到:jump_tag处执行下一条命令
    command2    #else 部分的命令
    b           #b 不加任何标签的话相当于跳转到最后一条指令(也就是对当前行什么都不再执行)
:jump_tag
    command1    #if 部分的命令