- 论坛徽章:
- 6
|
本帖最后由 a5love3n 于 2021-09-26 09:55 编辑
回复 5# vipty
把你的文件表上行号,方便说明
1 location /
2 {
3 root /data/http/m-cj-web/official;
4 index index.html index.htm;
5 try_files $uri $uri/ /index.html;
6 add_header Cache-Control max-age=31536000;
7 if ($request_filename ~* .(htm|html)$){
8 add_header Cache-Control no-cache;
9 #add_header filename $http_user_agent;
10 }
11 #error_page 502 404 /tips.html;
12 location /tips{
13 root /usr/local/nginx/html/;
14 index tips.html;
15 }
根据你给的例子分析,你的要求是:将第6行和第8行,第三项内容交换,第7行的 (htm|html) 替换为(js|cssl),删除掉#add开头的,也就是第9行
- awk '/Cache/&&p{print "\t\t"x" "$3;print a;print "\t\t"$1" "$2" "b;p=0;next}/Cache/{x=$1" "$2" ";b=$3;p=1;next}p{gsub(/htm\|html/,"js|cssl",$0);a=$0;next}1{print $0}' 1.txt
复制代码 整个处理流程如下:
处理 1-5行时:模式/Cache/&&p 模式/Cache/ 模式p都匹配不上,动作都跳过,只能匹配到模式1,因此会执行 1{print $0},也就是原样输出
处理低6行时:模式/Cache/&&p 匹配不上,跳过,模式/Cache/ 匹配成功,执行动作,x=$1" "$2" "是将“add_header Cache-Control ”这个内容,用变量x保存起来,
b=$3是把三项内容用变量b保存起来,p=1,是给变量p赋值为1,用作下一行的模式匹配,next是跳过后续模式和动作,直接处理下一行
处理第7行时:模式/Cache/&&p 模式/Cache/ 都匹配不上,跳过动作,模式P匹配成功(上一行处理时,P赋值为1了),执行动作,使用内置函数gsub将htm\|html替换为js|cssl
然后将替换后的整行内容$0用变量a保存起来,next跳过后续模式动作,继续处理下一行
处理第8行时:模式/Cache/&&p匹配成功,执行动作,print "\t\t"x" "$3拆解一下就是 “\t\t” x “ ” $3,2个tab,变量x(此时等于add_header Cache-Control ),“ ”(空格),$3(第8行的第三项 no-cache; )
print a ,输出变量a,就是第7行经过替换之后的内容
print "\t\t"$1" "$2" "b,2个tab,$1(第8行的第一项 add_header),“ ”(空格),$2(第8行的第二项(Cache-Control), “ ”空格,b(处理第6行时保存的第三项max-age=31536000;)
p=0变量p用完了,赋值为0,防止将其他行的html替换掉
处理9-15行时:同理,只能匹配到模式1,原样输出
处理第6和第八行时,写的有点繁杂,主要是为了保证通用性,使得,第六行和第8行的前2项不一致时,这个语法也可以通用,如果你能确保第六行和第8行只有第三项不一样的话,是可以简化一下的
也就是不需要用x来保存前两项的内容,直接把整行内容存储在变量中,
- awk '/Cache/&&p{print $0;print a;print b;p=0;next}/Cache/{b=$0;p=1;next}p{gsub(/htm\|html/,"js|cssl",$0);a=$0;next}1{print $0}'1.txt
复制代码
|
|