文档处理三贱客--sed

sed 简介

sed是一款很强大的文本编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用。处理文本时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(oattern space),接看用sed命令处理缓冲区中的内容,处理成后,把缓冲区的内容送往屏幕显示。接着理下一行,这样不断重复,直到文件末,文件内容没有改变,除非使用了写入的命令,将内容更新。

 sed参数详解

-n 使用静默模式,一般在sed的用法中,所有来自标准输入的内容都要print到屏幕,加-n后只显示经过sed处理的内容

-e<script>或--expression=<script> 实现多点编辑。例:sed -e script1 -e script2  somefile 

-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件

-h或--help 显示帮助。

-n或--quiet或--silent 仅显示script处理后的结果。

-V或--version 显示版本信息。

-r sed 的动作支持的是扩展正规表示法的语法。(预设是基础正则表示法语法)

-i 直接在文件上修改,不显示在终端

sed 动作

a :新增行, a 的后面可以是字串,而这些字串会在新的一行出现(当前行的下一行)
c :取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
i :插入行,i的后面可以接字串,而这些字串会在新的一行出现(当前行的上一行);
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 一般是替换符合条件的字符串而不是整行

sed 用例

解析一段binlog用于sed测试

 1 #cat  cat /home/nuanhuang/test.txt
 2 #191227 17:29:15 server id 4763306  end_log_pos 14751 CRC32 0x53110afd  Write_rows: table id 211 flags: STMT_END_F
 3 ### INSERT INTO `ht_test`.`ht1`
 4 ### SET
 5 ###   @1=1
 6 ###   @2='1111'
 7 ### INSERT INTO `ht_test`.`ht1`
 8 ### SET
 9 ###   @1=2
10 ###   @2='2222'
11 # at 14751
12 #191227 17:29:15 server id 4763306  end_log_pos 14782 CRC32 0x238a4786  Xid = 868
13 COMMIT/*!*/;
14 # at 14782
15 #191227 17:29:30 server id 4763306  end_log_pos 14847 CRC32 0x520624d3  GTID    last_committed=45       sequence_number=46      rbr_only=yes
16 /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
17 SET @@SESSION.GTID_NEXT= '0b715116-2886-11ea-be0d-fa163e74efe9:47'/*!*/;
18 # at 14847
19 #191227 17:29:30 server id 4763306  end_log_pos 14922 CRC32 0xb46695d0  Query   thread_id=267   exec_time=0     error_code=0
20 SET TIMESTAMP=1577438970/*!*/;
21 BEGIN
22 /*!*/;
23 # at 14922
24 #191227 17:29:30 server id 4763306  end_log_pos 14974 CRC32 0x93573ac1  Table_map: `ht_test`.`ht1` mapped to number 211
25 # at 14974
26 #191227 17:29:30 server id 4763306  end_log_pos 15029 CRC32 0xbdbb2863  Write_rows: table id 211 flags: STMT_END_F
27 ### INSERT INTO `ht_test`.`ht1`
28 ### SET
29 ###   @1=3
30 ###   @2='3333'
31 ### INSERT INTO `ht_test`.`ht1`
32 ### SET
33 ###   @1=4
34 ###   @2='4444'
35 # at 15029
36 #191227 17:29:30 server id 4763306  end_log_pos 15060 CRC32 0x3cf8ce70  Xid = 869
37 COMMIT/*!*/;
38 # at 15060
View Code

 sed 输出(p)

 1 # sed -n '25p' /home/nuanhuang/test.txt #sed 输出第25行
 2 #191227 17:29:30 server id 4763306 end_log_pos 15029 CRC32 0xbdbb2863 Write_rows: table id 211 flags: STMT_END_F
 3 
 4 # sed -n '25,33p' /home/nuanhuang/test.txt #输出25至33行
 5 #191227 17:29:30 server id 4763306 end_log_pos 15029 CRC32 0xbdbb2863 Write_rows: table id 211 flags: STMT_END_F
 6 ### INSERT INTO `ht_test`.`ht1`
 7 ### SET
 8 ### @1=3
 9 ### @2='3333'
10 ### INSERT INTO `ht_test`.`ht1`
11 ### SET
12 ### @1=4
13 ### @2='4444' 
14 
15 # sed -n '/end_log_pos 15029/p' /home/nuanhuang/test.txt #sed 匹配输出某行
16 #191227 17:29:30 server id 4763306 end_log_pos 15029 CRC32 0xbdbb2863 Write_rows: table id 211 flags: STMT_END_F
17 
18 # sed -n '1,/INSERT/p' /home/nuanhuang/test.txt #打印从第1行开始到第一个包含"INSERT" 结束的行,"," 逗号指定行的范围。
19 #191227 17:29:15 server id 4763306 end_log_pos 14751 CRC32 0x53110afd Write_rows: table id 211 flags: STMT_END_F
20 ### INSERT INTO `ht_test`.`ht1`
21 
22 # sed -n '/end_log_pos 15029/,/@ # 15029/p' /home/nuanhuang/test.txt #输出指定范围行, "," 逗号指定行的范围。
23 #191227 17:29:30 server id 4763306 end_log_pos 15029 CRC32 0xbdbb2863 Write_rows: table id 211 flags: STMT_END_F
24 ### INSERT INTO `ht_test`.`ht1`
25 ### SET
26 ### @1=3
27 ### @2='3333'
28 ### INSERT INTO `ht_test`.`ht1`
29 ### SET
30 ### @1=4
31 ### @2='4444'
32 # at 15029
33 #191227 17:29:30 server id 4763306 end_log_pos 15060 CRC32 0x3cf8ce70 Xid = 869
34 COMMIT/*!*/;
35 # at 15060
36 
37 # sed -n '/end_log_pos 15029/{n;p}' /home/nuanhuang/test.txt #输出包含"end_log_pos 15029" 的下一行
38 ### INSERT INTO `ht_test`.`ht1`
View Code

sed 替换(s)

 1 # sed -n 's/ht/HT/p' /home/nuanhuang/test.txt #将每行中第一个字符串"ht" 替换为 "HT"
 2 ### INSERT INTO `HT_test`.`ht1`
 3 ### INSERT INTO `HT_test`.`ht1`
 4 #191227 17:29:30 server id 4763306 end_log_pos 14974 CRC32 0x93573ac1 Table_map: `HT_test`.`ht1` mapped to number 211
 5 ### INSERT INTO `HT_test`.`ht1`
 6 ### INSERT INTO `HT_test`.`ht1`
 7 
 8 # sed -n 's/ht/HT/gp' /home/nuanhuang/test.txt #将所有字符串"ht" 替换为 "HT"; "g" 在行内进行全局替换
 9 ### INSERT INTO `HT_test`.`HT1`
10 ### INSERT INTO `HT_test`.`HT1`
11 #191227 17:29:30 server id 4763306 end_log_pos 14974 CRC32 0x93573ac1 Table_map: `HT_test`.`HT1` mapped to number 211
12 ### INSERT INTO `HT_test`.`HT1`
13 ### INSERT INTO `HT_test`.`HT1`
14 
15 # sed -n '1,10s/ht/HT/p' /home/nuanhuang/test.txt #第一到第十行替换 <==>sed -n -e '1,10p' -e 's/ht/HT/p' 
16 ### INSERT INTO `HT_test`.`ht1`
17 ### INSERT INTO `HT_test`.`ht1`
18 
19 # sed -n '20,$s/ht/HT/p' /home/nuanhuang/test.txt #20至最后一行替换 
20 #191227 17:29:30 server id 4763306 end_log_pos 14974 CRC32 0x93573ac1 Table_map: `HT_test`.`ht1` mapped to number 211
21 ### INSERT INTO `HT_test`.`ht1`
22 ### INSERT INTO `HT_test`.`ht1`
23 
24 # sed -n '/^# at /s/[0-9]\{1,\}/& end pos/p' test.txt #找到以"# at"开头的行,将该行第一个数字后面加上字符串" end pos";字符"&"用在替换串中时,它代表在查找串中匹配到的内容时。
25 # at 14751 end pos
26 # at 14782 end pos
27 # at 14847 end pos
28 # at 14922 end pos
29 # at 14974 end pos
30 # at 15029 end pos
31 # at 15060 end pos
32 
33 # sed -n 's/Write_\(rows\)/Change_\1/p' test.txt #圆括号里的模式rows作为标签1保存在特定的寄存器中。替换串可以通过\1来引用它。则 Margot 被替换为 Marlinane。 
34 #191227 17:29:15 server id 4763306 end_log_pos 14751 CRC32 0x53110afd Change_rows: table id 211 flags: STMT_END_F
35 #191227 17:29:30 server id 4763306 end_log_pos 15029 CRC32 0xbdbb2863 Change_rows: table id 211 flags: STMT_END_F
View Code

sed 删除(d)

1 # sed  '3d' /home/nuanhuang/test.txt     #删除第三行
2 # sed  '3,$d' /home/nuanhuang/test.txt   #删除第三至最后一行
3 # sed  '/Write_rows/d' /home/nuanhuang/test.txt    #删除包含"Write_rows"的行 
4 # sed -e '1,5d' -e 's/INSERT/XXXX/g' /home/nuanhuang/test.txt    #删除前五行,并把后面行中所有"INSERT"替换为"XXXX"
5 # sed '/INSERT/,10d' /home/nuanhuang/test.txt    删除包含"INSERT"的行到第十行的内容
View Code

sed插入行(i)

1 # sed '/INSERT/i XXXXXXXXX' /home/nuanhuang/test.txt  #匹配到"INSERT"前插一行
2 # sed '1i XXXXXXX' /home/nuanhuang/test.txt     #行首新增一行
3 # sed '$i XXXXXXX' /home/nuanhuang/test.txt     #行尾向上插入一行(新增倒数第二行)
4 # sed '3i ===========\n@@@@@@@@@@@@@@@@@@\n*********************' /home/nuanhuang/test.txt 第三行前面新增三行
View Code

sed新增行(a)

1 # sed '/INSERT/a XXXXXXXXX' /home/nuanhuang/test.txt  #匹配到"INSERT"后插一行
2 # sed '1a XXXXXXX' /home/nuanhuang/test.txt     #行首插入一行(新增第二行)
3 # sed '$a XXXXXXX' /home/nuanhuang/test.txt     #行尾插入一行
4 # sed '3a ===========\n@@@@@@@@@@@@@@@@@@\n*********************' /home/nuanhuang/test.txt 第三行后面新增三行
View Code

sed取代行(c)

1 # sed '1c XXXXXXXXXXXX' /home/nuanhuang/test.txt  | head    #第一行替换为"XXXXXXXXXXXX"
2 # sed '/# at/c XXXXXXXXXXXX' /home/nuanhuang/test.txt        #把以"# at"开头的行替换为 "XXXXXXXXXXXX" 
View Code

sed 正则

元字符 功 能 示 例 示例的匹配对象
^ 行首定位符 /^love/ 匹配所有以 love 开头的行
$ 行尾定位符 /love$/ 匹配所有以 love 结尾的行
. 匹配除换行外的单
个字符
/l..e/ 匹配包含字符 l、后跟两个任意
字符、再跟字母 的行
* 匹配零个或多个前
导字符
/*love/ 匹配在零个或多个空格紧跟着
模式 love 的行
[] 匹配指定字符组内
任一字符
/[Ll]ove/ 匹配包含 love 和 Love 的行
[^] 匹配不在指定字符
组内任一字符
/[^A-KM-Z]ove/ 匹配包含 ove,但 ove 之前的那
个字符不在 至 或 至 
的行
\(..\) 保存已匹配的字符
& 保存查找串以便在
替换串中引用
s/love/**&**/ 符号&代表查找串。字符串 love
将替换前后各加了两个**的引
用,即 love 变成**love**
\< 词首定位符 /\<love/ 匹配包含以 love 开头的单词的
\> 词尾定位符 /love\>/ 匹配包含以 love 结尾的单词的
x\{m\} 连续 个 x /o\{5\}/ 分别匹配出现连续 个字母 o
至少 个连续的 o、或 5~10 
连续的 的行
x\{m,\} 至少 个 x /o\{5,\}/
x\{m,n\} 至少 个 x,但不
超过 个 x
/o\{5,10\}/

posted on 2020-04-02 21:29  伊葭言  阅读(195)  评论(0)    收藏  举报