====== 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,3(第一行到第三行) - 二个正则表达式,如/^aa/,/bb$/(第一个以aa开头的行到第一个以bb结尾的行) - 一个整数一个正则表达式,如2,/^aa/(第二行到,第二行之后的第一个以aa开头的行。如果找不到那,会从第二行直接删到最后) - 也可以和 $ 搭配使用 sed中所有出现正则表达式的地方都要用/ /包起来 ---- ====== 操作符 ====== * i : 在匹配行之前插入一个字符串 - sed '1 i hello word'(在第一行之前插入hello word,允许有空格) * a : 在匹配行之后插入一个字符串 - sed '1 a hello word'(在第一行之后插入hello word,允许有空格) * d : 删除匹配的行 - sed '1 d' (删除第一行) - sed '1 !d' (删除所有行,除了第一行) * c : 替换整行 - sed '1 c hello word' (第一行换成hello word) * s : 用新的字符串替换旧的字符串 - sed 's/旧字符串/新字符串/' (替换匹配行中第一次出现的地方) - sed 's/旧字符串/新字符串/g'(替换匹配行中所有出现的地方) - sed -n 's/旧字符串/新字符串/g p'(替换匹配行中所有出现的地方,并打印出来) * p : 打印匹配到的行 - sed -n '1 p'(打印第一行) - sed -n '1 !p'(打印除了第一行) 只有操作符 s 和操作符 p 能连用, 操作符i,a,d均不能与操作符号 p 连用 * q : 退出 * n : 读取匹配行的下一行 * N : 读取匹配行和下一行 * I : 忽略大小写 - sed -n '/AbC/I p' * = : (=号表示打印行号) - * sed -n '/abc/ =' (打印包含abc字符串行号) ---- ====== 高级用法 ====== * sed -r '1 s/12(.*)56(.*)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 部分的命令