问题:有个文件test的内容以下:正则表达式
ert fff ** [abcfd] 123 324 444 [rty] ** fgfgf
需求:怎么能截取 [abcfd] ~ [rty] 这几行的内容出来呢?bash
答案:测试
sed -n '4,8'p test
上面代码确实可以解决问题,若是咱们设想一下test文件的行为1000行或者更多10000行咱们又该怎么去解决呢?code
sed -nr '/(abcfd)/,/rty/'p test
咱们能够匹配内容去寻找对应的匹配,更符合解决问题的方案。字符串
1.把每一个单词的第一个小写字母变大写:test
[root@yolks1 awk]# sed 's/\b[a-z]/\u&/g' test_awk.txt X:0:0:Root:/Root:/Bin/Bash Bin:X:1:1:Bin:/Bin:/Sbin/Nologin Daemon:X:2:2:Daemon:/Sbin:/Sbin/Nologin Adm:X:3:4:Adm:/Var/Adm:/Sbin/Nologin Lp:X:4:7:Lp:/Var/Spool/Lpd:/Sbin/Nologin Sync:X:5:0:Sync:/Sbin:/Bin/Sync
2.把全部小写变大写:awk
[root@yolks1 awk]# sed 's/[a-z]/\u&/g' test_awk.txt X:0:0:ROOT:/ROOT:/BIN/BASH BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC
3.大写变小写:sed
[root@yolks1 awk]# sed -i 's/[a-z]/\u&/g' test_awk.txt #变成大写并保存 [root@yolks1 awk]# cat test_awk.txt X:0:0:ROOT:/ROOT:/BIN/BASH BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC [root@yolks1 awk]# sed 's/[A-Z]/\l&/g' test_awk.txt #变回小写去 x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync
测试文件study.txt文件内容以下循环
[root@yolks1 awk]# cat study.txt asjksjks vnsksksl adkldsklsk;d l;ksd;lsl;s 230939kkdklksks dksks;ld
匹配以a字母开头的行结尾加 "1234"文件
[root@yolks1 awk]# sed -r 's/(^a.*)/\1 1234/' study.txt asjksjks 1234 vnsksksl adkldsklsk;d 1234 l;ksd;lsl;s 230939kkdklksks dksks;ld
[root@yolks1 awk]# cat study_sed.txt a b c d e f g h j k l [root@yolks1 awk]# [root@yolks1 awk]# sed '/c/{p;:a;N;$!ba;d}' study_sed.txt a b c
咱们来拆解下此命令的选项:
通俗理解:
if 匹配"c"
:a
追加下一行
if 不匹配"$"
goto a
最后退出循环,d命令删除。
[root@yolks1 awk]# sed -n '1,100{/root/p}' test_awk.txt