linux-shell脚本命令之sed
[ sed简介: ]
[ sed工作流程: ]
[ sed常用选项: ]
-n: 只会显示模式空间里的内容, 而不会显示没有编辑过的内容。
[ sed常用命令: ]
d: 删除, 因为是删除, 所以 d 后面通常不接任何东西;
s:
替代, 可以直接进行替换的工作, 通常这个 s 的动作可以搭配正规表示法;
a: 追加, a 的后面可以接字符串, 而这些字符串会在新的一行出现(目前的下一行);
i: 插入, i
的后面可以接字符串, 而这些字符串会在新的一行出现(目前的上一行);
c: 取代, c 的后面可以接字符串, 这些字符串可以取代一行内容;
[ 常用命令举例: ]
## 删除操作 d : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1. sed ‘$d‘ aaa.txt # 删除aaa.txt中最后一行 (对单行进行操作)
2. sed ‘7,9d‘ aaa.txt # 删除文件aaa.txt中第七行到第九行 (对多行进行操作)
3. sed ‘/aaa/,/bbb/d‘ aaa.txt # 删除文件aaa.txt中含有aaa至含有bbb之间所有的行 (对多行进行操作)
## 替代操作 s : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
替换格式: sed ‘range s/orig/new/sign‘ file # 如果没有指定范围的话, 将会对全文进行操作.
1. sed ‘s/aaa/bbb/‘ ccc.txt # 将ccc.txt全文中每行的第一个关键字 aaa 替换成 bbb, 因为我们没有指定任何模式2. sed ‘s/aaa/bbb/g‘ ccc.txt # 将ccc.txt全文中所有 aaa 替换成 bbb, 因为我们加了sign: g
3. sed ‘s/aaa/bbb/2‘ ccc.txt # 将ccc.txt全文中每行第二个 aaa 替换成 bbb, 因为我们加了sign: 2
4. sed ‘1s/aaa/bbb/g‘ ccc.txt # 将ccc.txt全文中第一行所有 aaa 替换成 bbb, 因为我们加了range: 1, 加了sign: g
5. 上面示例也可以用其他字符隔开(只有替换有): sed ‘s#aaa#bbb#‘ ccc.txt
6. old位置支持正则, 但在new位置不支持正则, 除了字符 \n \&
sed ‘1s/a/N&N/2‘ ccc.txt # 将ccc.txt全文中第一行第二个 a 替换成NaN, & 相当于对前面 a 的引用
7. 对特定的范围做多个操作, 那么我们要把多个操作用 { } 括起来, 用 ; 隔开多个命令.
sed ‘1{s/a/b/g; s/b/c/}‘ ccc.txt # 先将ccc.txt全文中第一行所有 a 替换成 b, 再将第一行第一个关键字 b 替换成 c
8. 上面所讲都是替换一个单词, 如果我们想替换某个字符, 那么可以使用 y 命令
sed ‘1y/abc/xyz/‘ ccc.txt # 将ccc.txt中全文第一行所有 a 替换成 x, b 替换成 y, c 替换成 z
2. sed ‘1a zhang\njim‘ ccc.txt # 在ccc.txt中第一行下面插入zhang再在下一行插入jim, \n 起换行作用
2. sed ‘$a abc‘ ccc.txt # 在ccc.txt中最后一行插入abc
2. sed ‘1c ab‘ ccc.txt # 将ccc.txt中第一行整行替换成ab
[ sed其他命令: ]
1. = 为显示行号
sed ‘/^abc/{=}‘ ccc.txt # 以abc开头的关键词所在的行号
2. n 为获取下一行 (当前行从模式空间删除, 下一行读入模式空间)
sed ‘/^a/ {n;s/b/B/g}‘ ccc.txt # 匹配以a开头的下一行整行, 使用 B 替换 b.
3. N 为读取多行内容到模式空间: (当前行和下一行都在模式空间中)
sed ‘/^A/{s/tb/TB/; N; s/t\nb/TB \n/}‘ ccc.txt # 匹配以 A 开头的行, 将tb替换成TB; 再读取下一行, 将当前行的t和下一行的b替换成TB
4. 使用多行模式空间的话, ^ 就不是行的开头, 而是模式空间的开头; $ 就不是行的结尾, 而是模式空间的结束.
替换前:a b c d e 替换后:A b c d e
a b c d e a b c d e
sed ‘N; s/^a/A/‘ ddd.txt # 第一行和第二行都会被读入模式空间, 但只有第一行的 a 会被替换成 A, 第二行的 a 并不会被替换.
替换前:a b c d e 替换后: a b c d e
a b c d e a b c d E
sed ‘N; s/e$/E/‘ ddd.txt # 第一行和第二行都会被读入模式空间, 但只有第二行的 e 会被替换成 E, 第一行的 e 并不会被替换.
5. 除了模式空间, 还有保持空间, 我们可以把它理解成一个缓存. 保持空间的内容和模式空间的内容可以互换
h : 把模式空间内容存储到保持空间; G : 把保持空间里面的内容存储到模式空间;
替换前:a 替换后:bb a
aa bb
bb aa
sed ‘/a/{h; d}; /b/{G}‘ eee.txt # 匹配含有 a 的那一行,把它们保存在保持空间并从模式空间删除;匹配含有b的那一行,把保持空间内容放到模式空间;
6. set里面没有循环, 如果想实现循环的效果, 可以借助标签