亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 急,請問如用sed替換塊的內容 [打印本頁]

作者: vipty    時間: 2021-09-01 17:49
標題: 急,請問如用sed替換塊的內容
例如:
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;
                }


作者: a5love3n    時間: 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;
                }


作者: shell_1    時間: 2021-09-15 16:54
sed -r '/add_header Cache-Control/{:a;N;/\n.*}.*$/!{ba};s/.*/aaaaaaaaa/}' file

aaa替換成a\nb\nc格式
作者: vipty    時間: 2021-09-24 10:31
感謝樓上大神
作者: vipty    時間: 2021-09-24 11:01
回復 2# a5love3n

能幫忙解釋下意思嗎,看了好久根本看不懂啊
作者: vipty    時間: 2021-09-24 11:09
回復 3# shell_1

也是沒研究懂什么意思
作者: a5love3n    時間: 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,因此會執(zhí)行 1{print $0},也就是原樣輸出
處理低6行時:模式/Cache/&&p 匹配不上,跳過,模式/Cache/ 匹配成功,執(zhí)行動作,x=$1" "$2" "是將“add_header Cache-Control ”這個內容,用變量x保存起來,
                   b=$3是把三項內容用變量b保存起來,p=1,是給變量p賦值為1,用作下一行的模式匹配,next是跳過后續(xù)模式和動作,直接處理下一行
處理第7行時:模式/Cache/&&p 模式/Cache/ 都匹配不上,跳過動作,模式P匹配成功(上一行處理時,P賦值為1了),執(zhí)行動作,使用內置函數gsub將htm\|html替換為js|cssl
                   然后將替換后的整行內容$0用變量a保存起來,next跳過后續(xù)模式動作,繼續(xù)處理下一行
處理第8行時:模式/Cache/&&p匹配成功,執(zhí)行動作,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
復制代碼


作者: vipty    時間: 2021-10-08 09:40
回復 7# a5love3n

果然是大神,非常感謝
作者: vipty    時間: 2021-10-08 09:45
回復 7# a5love3n

那麻煩問下,下面的這個server地址如果做成可以根據變量自動變動的需要用awk怎么做呢,sed我知道可以替換。文件里有這么一段
    upstream nat {
       server 172.20.128.240:80;
    }

比如我的環(huán)境變量設置為
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;
    }




作者: a5love3n    時間: 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;
    }




作者: vipty    時間: 2021-10-08 12:10
回復 10# a5love3n

你也太厲害了吧,我用python寫還要那么多行,沒想到你直接一條命令解決了。
  1. import os,sys
  2. server = os.getenv('server')
  3. f = open('a','r+')
  4. s = f.readlines()
  5. ss = ''
  6. for i in server.split(','):
  7.     ss = ss + "\tserver " + i + ";\n"
  8. s[1] = ss
  9. f=open('a','w+')
  10. f.writelines(s)
  11. f.close()
復制代碼



作者: vipty    時間: 2021-10-08 12:11
回復 10# a5love3n

強,我用python寫了那么多行,你竟然一條命令就解決了,也太厲害了吧。import os,sys
server = os.getenv('server')
f = open('a','r+')
s = f.readlines()
ss = ''
for i in server.split(','):
    ss = ss + "\tserver " + i + ";\n"
s[1] = ss
f=open('a','w+')
f.writelines(s)
f.close()


作者: vipty    時間: 2021-10-08 12:11
回復 10# a5love3n
回復,你也太厲害了,我python實現還要寫那么多行呢,沒想到你一行命令就搞定了。
作者: vipty    時間: 2021-10-08 12:13
剛剛回復顯示失敗,就多發(fā)了幾次。
作者: vipty    時間: 2021-10-08 12:16
回復 10# a5love3n

我執(zhí)行的結果是這樣的哦awk 'BEGIN{split(ENVIRON["server"],ser,",")}/server/{for(i in ser){print "server "ser";"};next}1' a
    upstream nat {
server 172.20.128.240:80;
server 172.20.128.241:80;
server 172.20.128.242:80;
    }
server 172.20.128.240:80;
server 172.20.128.241:80;
server 172.20.128.242:80;
        listen 80 default;
server 172.20.128.240:80;
server 172.20.128.241:80;
server 172.20.128.242:80;

還要麻煩問下怎么保存到當前文件啊,以前用filename好像有時候會出錯。

作者: a5love3n    時間: 2021-10-08 13:38
本帖最后由 a5love3n 于 2021-10-08 13:53 編輯

回復 15# vipty

據我所知,awk無法修改原文件,要操作原文件的話,還是用sed吧
找到一種做法

awk 'BEGIN{split(ENVIRON["server"],ser,",")}/server/{for(i in ser){print "server "ser";">"1.txt"};next}1{print $0 >"1.txt"}' 1.txt

結果如下:
cat 1.txt
upstream nat {
server 172.20.128.240:80;
server 172.20.128.241:80;
server 172.20.128.242:80;
    }



作者: vipty    時間: 2021-10-08 14:18
回復 10# a5love3n

我知道為什么我這里會報錯了我的文件里還有一個server,是不是要修改下匹配值啊,另外awk怎么保存到當前文件啊
  1.     upstream nat {
  2.        server 172.20.128.240:80;
  3.     }
  4.     server{
  5.         listen 80 default;
  6.         server_name _;
  7.         location / {
  8.             proxy_pass http://nat;
  9.             proxy_set_header Host $http_host;
  10.             proxy_redirect off;
  11.             proxy_set_header X-Real-IP $remote_addr;
  12.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  13.             proxy_set_header  X-Forwarded-Host   $host;
  14.             proxy_set_header  X-Forwarded-Server $host;
  15.             proxy_set_header  X-Forwarded-Proto  $scheme;
  16.             proxy_connect_timeout 600;
  17.             proxy_read_timeout 600;
  18.             proxy_send_timeout 600;
  19.         }
  20.         
復制代碼



作者: a5love3n    時間: 2021-10-08 14:31
本帖最后由 a5love3n 于 2021-10-12 10:15 編輯

重復,編輯掉


作者: a5love3n    時間: 2021-10-08 14:33
本帖最后由 a5love3n 于 2021-10-12 10:16 編輯

重復,編輯掉
作者: a5love3n    時間: 2021-10-08 14:35
本帖最后由 a5love3n 于 2021-10-12 10:16 編輯

重復,編輯掉
作者: a5love3n    時間: 2021-10-08 14:36
回復 17# vipty

  1. awk 'BEGIN{split(ENVIRON["server"],ser,",")}/server 1/{for(i in ser){print "\tserver "ser[i]";">"1.txt"};next}1{print $0 >"1.txt"}' 1.txt
復制代碼
修改了匹配值并且保存到原文件,你替換掉所有的 1.txt 即可
作者: vipty    時間: 2021-10-08 17:07
回復 21# a5love3n

收到,非常感謝,學習到了。




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2