免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 9351 | 回复: 21
打印 上一主题 下一主题

[文本处理] 急,请问如用sed替换块的内容 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2021-09-01 17:49 |只看该作者 |倒序浏览
例如:
cat file
        location /
        {
                root /data/http/m-cj-web/official;
                index index.html index.htm;
                try_files $uri $uri/ /index.html;
                add_header Cache-Control max-age=31536000;
                if ($request_filename ~* .(htm|html)$){
                    add_header Cache-Control no-cache;
                    #add_header filename $http_user_agent;
                }
                #error_page 502 404  /tips.html;
                location /tips{
                        root /usr/local/nginx/html/;
                        index tips.html;
                }
如何替换掉中间的一段内容
                add_header Cache-Control max-age=31536000;
                if ($request_filename ~* .(htm|html)$){
                    add_header Cache-Control no-cache;
                    #add_header filename $http_user_agent;
                }

换成
                 add_header Cache-Control no-cache;
                if ($request_filename ~* .(js|cssl)$){
                    add_header Cache-Control max-age=31536000;
                }

论坛徽章:
6
15-16赛季CBA联赛之浙江
日期:2021-07-14 11:18:4315-16赛季CBA联赛之浙江
日期:2021-08-20 17:26:1015-16赛季CBA联赛之天津
日期:2021-09-01 10:56:4619周年集字徽章-19
日期:2021-10-12 11:08:032016科比退役纪念章
日期:2021-10-12 11:33:4515-16赛季CBA联赛之深圳
日期:2021-11-11 14:25:38
2 [报告]
发表于 2021-09-02 16:13 |只看该作者
本帖最后由 a5love3n 于 2021-09-02 16:16 编辑
  1. 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
复制代码


结果:
location /
        {
                root /data/http/m-cj-web/official;
                index index.html index.htm;
                try_files $uri $uri/ /index.html;
                add_header Cache-Control  no-cache;
                if ($request_filename ~* .(js|cssl)$){
                add_header Cache-Control max-age=31536000;
                    #add_header filename $http_user_agent;
                }
                #error_page 502 404  /tips.html;
                location /tips{
                        root /usr/local/nginx/html/;
                        index tips.html;
                }

论坛徽章:
3
19周年集字徽章-周
日期:2021-09-17 14:05:3020周年集字徽章-周	
日期:2021-09-17 15:31:3019周年集字徽章-年
日期:2021-10-09 10:30:14
3 [报告]
发表于 2021-09-15 16:54 |只看该作者
sed -r '/add_header Cache-Control/{:a;N;/\n.*}.*$/!{ba};s/.*/aaaaaaaaa/}' file

aaa替换成a\nb\nc格式

论坛徽章:
0
4 [报告]
发表于 2021-09-24 10:31 |只看该作者
感谢楼上大神

论坛徽章:
0
5 [报告]
发表于 2021-09-24 11:01 |只看该作者
回复 2# a5love3n

能帮忙解释下意思吗,看了好久根本看不懂啊

论坛徽章:
0
6 [报告]
发表于 2021-09-24 11:09 |只看该作者
回复 3# shell_1

也是没研究懂什么意思

论坛徽章:
6
15-16赛季CBA联赛之浙江
日期:2021-07-14 11:18:4315-16赛季CBA联赛之浙江
日期:2021-08-20 17:26:1015-16赛季CBA联赛之天津
日期:2021-09-01 10:56:4619周年集字徽章-19
日期:2021-10-12 11:08:032016科比退役纪念章
日期:2021-10-12 11:33:4515-16赛季CBA联赛之深圳
日期:2021-11-11 14:25:38
7 [报告]
发表于 2021-09-24 14:44 |只看该作者
本帖最后由 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行
  1. 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来保存前两项的内容,直接把整行内容存储在变量中,
  1. 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
复制代码

论坛徽章:
0
8 [报告]
发表于 2021-10-08 09:40 |只看该作者
回复 7# a5love3n

果然是大神,非常感谢

论坛徽章:
0
9 [报告]
发表于 2021-10-08 09:45 |只看该作者
回复 7# a5love3n

那麻烦问下,下面的这个server地址如果做成可以根据变量自动变动的需要用awk怎么做呢,sed我知道可以替换。文件里有这么一段
    upstream nat {
       server 172.20.128.240:80;
    }

比如我的环境变量设置为
server="172.20.128.240:80,172.20.128.241:80,172.20.128.242:80"
怎么可以替换成下面这个样子呢
    upstream nat {
       server 172.20.128.240:80;
       server 172.20.128.241:80;
       server 172.20.128.242:80;
    }



论坛徽章:
6
15-16赛季CBA联赛之浙江
日期:2021-07-14 11:18:4315-16赛季CBA联赛之浙江
日期:2021-08-20 17:26:1015-16赛季CBA联赛之天津
日期:2021-09-01 10:56:4619周年集字徽章-19
日期:2021-10-12 11:08:032016科比退役纪念章
日期:2021-10-12 11:33:4515-16赛季CBA联赛之深圳
日期:2021-11-11 14:25:38
10 [报告]
发表于 2021-10-08 11:44 |只看该作者
本帖最后由 a5love3n 于 2021-10-08 11:51 编辑

回复 9# vipty
根据你的描述做的
  1. cat 1.txt
  2. upstream nat {
  3.        server 172.20.128.240:80;
  4.     }

  5. server="172.20.128.240:80,172.20.128.241:80,172.20.128.242:80"

  6. export server

  7. awk 'BEGIN{split(ENVIRON["server"],ser,",")}/server/{for(i in ser){print "server "ser[i]";"};next}1' 1.txt
复制代码
结果如下
upstream nat {
server 172.20.128.240:80;
server 172.20.128.241:80;
server 172.20.128.242:80;
    }



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP