====== 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 部分的命令