英文手册: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

引用已匹配的字符串

& 用来代表已匹配的字符串

  1. [bae:hjq-dev7-d ~]$ sed 's/A/_&_/ig' ./a.log
  2. 112233
  3. _a__a_bbcc
  4. _a_1b2c3
  5. 1_a_2b3c
  6. [bae:hjq-dev7-d ~]$ cat a.log
  7. 112233
  8. aabbcc
  9. a1b2c3
  10. 1a2b3c

正则批量替换

  • 使用 -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

  1. <a name="ZRuyM"></a>
  2. # 处理动作类型
  3. <a name="zj1Xi"></a>
  4. ## d 删除行
  5. ```bash
  6. #删除1-2行
  7. sed '1,2d' a.log
  8. #删除 5-最后一行
  9. 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