英文手册:https://www.gnu.org/software/sed/manual/sed.html
sed 's/原字符串/替换字符串/'
特殊字符需要使用反斜线”\”进行转义,但是单引号”‘”是没有办法用反斜线”\”转义的,这时候只要把命令中的单引号改为双引号
例如:sed “s/原有‘’字符/替换字符/”
说明:
1.从文件中读取数据,StreamEDitor流(行)编辑器,逐行处理文本;
Sed 是一个脚本型的编译器,是非交互式的编辑器
2.模式空间(将一行数据加载到内存,进行处理),默认不编辑源文件,仅对模式空间中的数据处理,将处理的数据输出到屏幕
sed 会读取文件,处理后再输出出来,不会修改源文件。
替换
可用的正则
不支持 \d \n
支持列表
^
$
. 单个字符
+、*、?、{m,n}
\
[123abc]
[0-9]
[a-z]
分隔符号
分隔符可以时/、# 、@ 等字符串
s///
s@@@
替换的数量
首个替换
sed ‘s/原字符串/替换字符串/‘ a.log
全部替换
sed ‘s/原字符串/替换字符串/g’ a.log
忽略大小写
默认区分大小写,i 不区分大小写
sed ‘s/原字符串/替换字符串/i’ a.log
引用已匹配的字符串
& 用来代表已匹配的字符串
[bae:hjq-dev7-d ~]$ sed 's/A/_&_/ig' ./a.log112233_a__a_bbcc_a_1b2c31_a_2b3c[bae:hjq-dev7-d ~]$ cat a.log112233aabbcca1b2c31a2b3c
正则批量替换
- 使用 -r -e 开启正则
- 使用\1 \2 代表已匹配的值
```bash
❯ echo $a
{“code”:2000,”message”:”成功”,”result”:{“data”:[{“mobile”:”19999199933”,”uid”:1010005200,”type_name”:”购买智能组合”,”source”:”server”,”bdate”:”2021-11-18”,”amount”:”40000”,”reg_source”:”lxg”}],”current”:1,”pageSize”:1,”total”:1}
❯ echo $a | sed -r ‘s/.+([0-9]{11}).+([0-9]{10}).+/\1 \2/g’ 19999199933 1010005200
<a name="ZRuyM"></a># 处理动作类型<a name="zj1Xi"></a>## d 删除行```bash#删除1-2行sed '1,2d' a.log#删除 5-最后一行sed '5,$d' a.log
a/i 新增行
a - 后面新增行
i - 前面新增行
#在第二行后面新增一行内容为 eeee
sed '2aeeee' a.log
#在第二行及其以后的每一行的后面都新增一行内容为 eeee
sed '2,$aeeee' a.log
[bae:hjq-dev7-d ~]$ sed '2aeeeee' ./a.log
112233
aabbcc
eeeee
a1b2c3
1a2b3c
[bae:hjq-dev7-d ~]$ sed '2,$aeeeee' ./a.log
112233
aabbcc
eeeee
a1b2c3
eeeee
1a2b3c
eeeee
c 整体取代
#将第2行及其后面的行整体替换为 111
sed '2,$c111' a.log
[bae:hjq-dev7-d ~]$ sed '2,$ceeeee' ./a.log
112233
eeeee
[bae:hjq-dev7-d ~]$ cat a.log
112233
aabbcc
a1b2c3
1a2b3c
r 插入外部文件
r file 将指定文件的内容天骄到符合条件的行后
w 写到外部文件
sed ‘2,5w~/b.log’ a.log
w file 将指定范围内的内容另存至指定的文件中
行号位置表示
行号
单个行号
n 第n行
行号范围-绝对
n1,n2 n1 - n2 行,全包含
行号范围-相对
n1,+n n1 - n1后 n 行,全包含
#删除第5行
send '5d' a.log
#删除5至10行
sed '5,10d' a.log
#删除第10行及其后面的20行
sed '10,+20' a.log
仅输出匹配的行
sed -n ‘2,3p’ a.log
-n 只输出 script 处理后的行
仅输出匹配的行
cat a.log | sed -n ‘/pexreg/p’
正则
正则匹配所有行
/regexp/ 符合正则的所有行
两个正则之间的行
/pattern1/,/pattern2/
验证命令
sed 是处理行数据的命令
通过 nl 命令 可以对原始文件内容每行前附加行号后进行输出,再通过 | 管道符,交由 sed 处理,通过结果即可查看到命令的影响结果。
#原始内容附加行号
[bae:hjq-dev7-d ~]$ nl a.log
1 112233
2 aabbcc
3 a1b2c3
4 1a2b3c
# 删除2-3行
[bae:hjq-dev7-d ~]$ nl a.log | sed '2,3d'
1 112233
4 1a2b3c
# 2-3行后各新增一行
[bae:hjq-dev7-d ~]$ nl a.log | sed '2,3azzzzz'
1 112233
2 aabbcc
zzzzz
3 a1b2c3
zzzzz
4 1a2b3c
