文档处理三贱客--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
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`
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
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"的行到第十行的内容
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 第三行前面新增三行
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 第三行后面新增三行
sed取代行(c)
1 # sed '1c XXXXXXXXXXXX' /home/nuanhuang/test.txt | head #第一行替换为"XXXXXXXXXXXX" 2 # sed '/# at/c XXXXXXXXXXXX' /home/nuanhuang/test.txt #把以"# at"开头的行替换为 "XXXXXXXXXXXX"
sed 正则
| 元字符 | 功 能 | 示 例 | 示例的匹配对象 |
| ^ | 行首定位符 | /^love/ | 匹配所有以 love 开头的行 |
| $ | 行尾定位符 | /love$/ | 匹配所有以 love 结尾的行 |
| . | 匹配除换行外的单 个字符 |
/l..e/ | 匹配包含字符 l、后跟两个任意 字符、再跟字母 e 的行 |
| * | 匹配零个或多个前 导字符 |
/*love/ | 匹配在零个或多个空格紧跟着 模式 love 的行 |
| [] | 匹配指定字符组内 任一字符 |
/[Ll]ove/ | 匹配包含 love 和 Love 的行 |
| [^] | 匹配不在指定字符 组内任一字符 |
/[^A-KM-Z]ove/ | 匹配包含 ove,但 ove 之前的那 个字符不在 A 至 K 或 M 至 Z 间 的行 |
| \(..\) | 保存已匹配的字符 | ||
| & | 保存查找串以便在 替换串中引用 |
s/love/**&**/ | 符号&代表查找串。字符串 love 将替换前后各加了两个**的引 用,即 love 变成**love** |
| \< | 词首定位符 | /\<love/ | 匹配包含以 love 开头的单词的 行 |
| \> | 词尾定位符 | /love\>/ | 匹配包含以 love 结尾的单词的 行 |
| x\{m\} | 连续 m 个 x | /o\{5\}/ | 分别匹配出现连续 5 个字母 o、 至少 5 个连续的 o、或 5~10 个 连续的 o 的行 |
| x\{m,\} | 至少 m 个 x | /o\{5,\}/ | |
| x\{m,n\} | 至少 m 个 x,但不 超过 n 个 x |
/o\{5,10\}/ |
浙公网安备 33010602011771号