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

Chinaunix

標(biāo)題: 求個(gè)sed [打印本頁(yè)]

作者: waily    時(shí)間: 2012-03-27 09:39
標(biāo)題: 求個(gè)sed
本帖最后由 waily 于 2012-03-27 09:45 編輯

文本如下
  1. .....
  2. subnet 10.10.10.10 mask 255.255.255.0 {
  3.    option ....
  4.    #....{
  5.    pool {
  6.       option ...
  7.       option ....
  8.    }
  9. }
  10. .....
復(fù)制代碼
文本中大量
以subnet .... mask .... {開(kāi)始,以}結(jié)束的配置,
但在{}之內(nèi)還有{},{}是成對(duì)出現(xiàn)的(有可能有注釋掉的行包含{或},注釋掉的可能不成對(duì))

要求按指定網(wǎng)段,比如上述的10.10.10.10(這具有唯一性),把subnet .... mask .... {開(kāi)始的,以}結(jié)束的都刪除
作者: blackold    時(shí)間: 2012-03-27 09:39
本帖最后由 blackold 于 2012-03-27 13:34 編輯

回復(fù) 9# waily


    try:
  1. sed '/subnet 10\.10\.10\.10/{:n;N;s/#[^\n]*//g;s/{[^{}]*}//g;/{/bn;d}' urfile
復(fù)制代碼

作者: yuhuohu    時(shí)間: 2012-03-27 09:46
awk我倒是有思路,sed....求高人
作者: hbmhalley    時(shí)間: 2012-03-27 09:49
能否假設(shè)代碼是縮進(jìn)過(guò)且非惡趣味的?
作者: hbmhalley    時(shí)間: 2012-03-27 09:55

  1. sed -n '/^subnet 10.10.10.10 mask.*{$/{:1;n;/^\s/b1;d;};p'
復(fù)制代碼
我猜差不多
作者: waily    時(shí)間: 2012-03-27 09:55
回復(fù) 3# hbmhalley


    不能保證
作者: waily    時(shí)間: 2012-03-27 09:59
回復(fù) 4# hbmhalley


    sed -n '/^subnet 10.10.10.10 mask.*{$/{:1;n;/^\s/b1;d;};p'

大哥,求解釋

'
/^subnet 10.10.10.10 mask.*{$/是進(jìn)行匹配

{:1;n;---不明白


/^\s/ 再次匹配,但不明白\s

b1;d;};p ---------只看懂p是打印....

作者: blackold    時(shí)間: 2012-03-27 10:01
回復(fù) 1# waily
  1. sed '/subnet 10\.10\.10\.10/{:n;N;s/{[^{}]*}//g;/{/bn;d}' urfile
復(fù)制代碼

作者: yuhuohu    時(shí)間: 2012-03-27 10:24
回復(fù) 7# blackold


    黑哥,求解釋
作者: waily    時(shí)間: 2012-03-27 10:27
回復(fù) 7# blackold


    黑哥,碰到有注釋的行含有{時(shí)刪不干凈了

作者: blackold    時(shí)間: 2012-03-27 10:28
回復(fù) 9# waily


    沒(méi)考慮注釋行里也有{}的情況。
作者: cjaizss    時(shí)間: 2012-03-27 10:31
easy
作者: blackold    時(shí)間: 2012-03-27 10:34
回復(fù) 8# yuhuohu


    就是正則匹配啊。
作者: yuhuohu    時(shí)間: 2012-03-27 10:36
回復(fù) 9# waily


    木有事,先用sed刪除一遍,哈哈
作者: yuhuohu    時(shí)間: 2012-03-27 10:37
回復(fù) 13# blackold


    sed的指令看的很暈,看來(lái)要發(fā)點(diǎn)時(shí)間仔細(xì)的鉆研sed的理論知識(shí)
作者: ywlscpl    時(shí)間: 2012-03-27 10:39
  1. awk -v net="10.10.10.10" '!n{T=0}/^subnet/&&$2==net{sub(/{ *$/,"");print;n++;T=1}!/ *#/&&/{/{n++}!/ *#/&&/} *$/{n--}!T' file
復(fù)制代碼

作者: cjaizss    時(shí)間: 2012-03-27 10:51
中午寫(xiě)一個(gè),現(xiàn)在適合準(zhǔn)備吃午飯
作者: cjaizss    時(shí)間: 2012-03-27 10:52
本帖最后由 cjaizss 于 2012-03-27 10:53 編輯

代碼里試圖解決這樣的情況
subnet 10.10.10.10 mask 255.255.255.0 {

   option ....

   #....{

   pool {

      option ...

      option ....
}

   } subnet 10.10.10.10 mask 255.255.255.0
{
...

}


作者: yinyuemi    時(shí)間: 2012-03-27 12:42
  1. sed -rn '/subnet 10.10.10.10/{:a;/\{/{x;s/^/#/;x;};/#/{n};/\}/{x;/^#{1}$/;s/#//;x;};n;ba};p'
復(fù)制代碼

作者: waily    時(shí)間: 2012-03-27 12:54
回復(fù) 12# blackold


    可以了,謝謝!

sed '/subnet 10\.10\.10\.0/{
:n;N;
s/#[^\n]*/g/;-----------這行的s怎么怪怪的呢?正常不都是s/a/b/g; 把a(bǔ)替換成b嗎,s/a/g/是啥意思呀,黑哥
s/{[^{}]*}//g;
/{/bn;d
}'  urlfile



作者: jiejie455    時(shí)間: 2012-03-27 13:10
本帖最后由 jiejie455 于 2012-03-27 13:15 編輯

和19樓yinyuemi的思路差不多,打點(diǎn)計(jì)數(shù)法,第一次寫(xiě)這么長(zhǎng)的sed, 不知道寫(xiě)的對(duì)不對(duì),忘各位大俠指點(diǎn)。
  1. $ cat data.sed
  2. #!/bin/sed -f

  3. /subnet 10\.10\.10\.10/{
  4.         :a

  5.         /^[ ]*#/{
  6.                 n
  7.         }

  8.         /{/{
  9.                 x
  10.                 s/^/\./
  11.                 x
  12.         }

  13.         /}/{
  14.                 x
  15.                 s/\.//
  16.                 /^$/{
  17.                         x
  18.                         b
  19.                 }
  20.                 x
  21.         }
  22.         n
  23.         ba
  24. }
  25. p
復(fù)制代碼

作者: blackold    時(shí)間: 2012-03-27 13:35
回復(fù) 20# waily


    汗,是我寫(xiě)錯(cuò)了。已更正。

謝謝提醒!
作者: mpstat    時(shí)間: 2012-03-27 14:02
waily 發(fā)表于 2012-03-27 10:27
回復(fù) 7# blackold


.............
作者: waily    時(shí)間: 2012-03-27 15:26
謝謝各位
作者: yuhuohu    時(shí)間: 2012-03-27 15:52
本帖最后由 yuhuohu 于 2012-03-27 19:17 編輯

回復(fù) 2# blackold


    嘗試講解一下黑哥的思路,黑哥請(qǐng)指教。

sed '
/subnet 10\.10\.10\.10/{       #先匹配到subnet 10.10.10.10這樣,然后進(jìn)行下面的處理
:n;                                       #創(chuàng)建名為n的標(biāo)簽
N;                                        #讀入下一行,并追加到當(dāng)前模式空間內(nèi)容的末尾,在兩行之間加入換行符
s/#[^\n]*//g;                       #把匹配正則表達(dá)式 【#[^\n]*】 的字符串刪除,這樣在注釋中有出現(xiàn){}的都被刪除了
s/{[^{}]*}//g;                     #把匹配正則表達(dá)式 【{[^{}]*}】 的字符串刪除,這樣就把在subnet....{}內(nèi)成對(duì)出現(xiàn)的{}刪除了
/{/bn;                                  #匹配到{符號(hào),就跳轉(zhuǎn)到標(biāo)簽n處,繼續(xù)處理
d                                         #刪除剩下的內(nèi)容
}' urfile

這里我有點(diǎn)小小的不理解,怎么實(shí)現(xiàn)的跳出這個(gè)標(biāo)簽循環(huán)呢?沒(méi)看見(jiàn)說(shuō)到出現(xiàn)}時(shí)結(jié)束呀
作者: yuhuohu    時(shí)間: 2012-03-27 16:14
本帖最后由 yuhuohu 于 2012-03-27 16:48 編輯
yinyuemi 發(fā)表于 2012-03-27 12:42

繼續(xù)拆解yinyuemi的代碼
sed -rn '/subnet 10.10.10.10/{:a;/\{/{x;s/^/#/;x;};/#/{n};/\}/{x;/^#{1}$/;s/#//;x;};n;ba};p'

sed -rn '
/subnet 10.10.10.10/         #匹配10.10.10.10
{
  :a;                                 #創(chuàng)建標(biāo)簽a
  /\{/{                              #匹配符號(hào)#
         x;                           #交換暫存緩沖區(qū)和模式空間的內(nèi)容
         s/^/#/;                   #在行首加入#符號(hào)(不太明白為什么要加#)
         x;                           #交換暫存緩沖區(qū)和模式空間的內(nèi)容,緩沖區(qū)變成內(nèi)容變成"#subnet 10.10.10.10 ....",模式空間內(nèi)容恢復(fù)原樣
        };                            #
  /#/{                              #匹配符號(hào)#
         n                           #讀入下一行
       };                            #
  /\}/{                             #匹配符號(hào)}
         x;                          #交換暫存緩沖區(qū)和模式空間的內(nèi)容,緩沖區(qū)變成subnet...的下一行,模式空間"#subnet 10.10.10.10 ...."
         /^#{1}$/{             #匹配一整行以#符號(hào)開(kāi)始且只有一個(gè)#符號(hào)的行
                         b           #跳轉(zhuǎn)到標(biāo)簽???
                        };           #
         s/#//;                    #把第一個(gè)#符號(hào)刪除
         x;                         #交換暫存緩沖區(qū)和模式空間的內(nèi)容,模式空間內(nèi)容恢復(fù)原樣,緩沖區(qū)的內(nèi)容??
       };                           #
  n;                                #讀入下一行
  ba                               #跳轉(zhuǎn)到標(biāo)簽a處
};                                 #
p'                                 #輸出

我亂了....
作者: yuhuohu    時(shí)間: 2012-03-27 16:20
回復(fù) 21# jiejie455


    哥們厲害呀,我?guī)缀踉诳刺鞎?shū)了
作者: waily    時(shí)間: 2012-03-27 17:22
誰(shuí)來(lái)解釋一下yuhuohu在25,26樓留下的疑惑呀,我也想知道啊
作者: blackold    時(shí)間: 2012-03-27 18:41
回復(fù) 25# yuhuohu


    沒(méi)有 { 時(shí)就跳出了。也就是把里面配對(duì)的{}都清除完了,就跳出。
作者: yuhuohu    時(shí)間: 2012-03-27 19:16
回復(fù) 29# blackold


    哦,明白了,實(shí)際上sed一直在/subnet 10\.10\.10\.10/這行工作
作者: yinyuemi    時(shí)間: 2012-03-27 23:42
回復(fù) 26# yuhuohu


    sed -rn '
/subnet 10.10.10.10/         #匹配10.10.10.10
{
  :a;                                 #創(chuàng)建標(biāo)簽a
  /\{/{                              #匹配符號(hào)'{'
         x;                           #交換暫存緩沖區(qū)和模式空間的內(nèi)容
         s/^/#/;                   #在行首加入#符號(hào)(不太明白為什么要加#) --- '#' 可以換成其它字符,這里只是作為一個(gè)標(biāo)記而已。
          x;                           #交換暫存緩沖區(qū)和模式空間的內(nèi)容,緩沖區(qū)變成內(nèi)容變成"#subnet 10.10.10.10 ....",模式空間內(nèi)容恢復(fù)原樣
        };                            #
  /#/{                              #匹配符號(hào)#
         n                           #讀入下一行
       };                            #
  /\}/{                             #匹配符號(hào)}
         x;                          #交換暫存緩沖區(qū)和模式空間的內(nèi)容,緩沖區(qū)變成subnet...的下一行,模式空間"#subnet 10.10.10.10 ...."
         /^#{1}$/{             #匹配一整行以#符號(hào)開(kāi)始且只有一個(gè)#符號(hào)的行
                         b           #跳轉(zhuǎn)到標(biāo)簽???--- b分支后面有l(wèi)abel則強(qiáng)制返回label除,如果沒(méi)有,跳過(guò)后面所有的命令,(if label is omitted, branch to end of script.

                        };           #
         s/#//;                    #把第一個(gè)#符號(hào)刪除
         x;                         #交換暫存緩沖區(qū)和模式空間的內(nèi)容,模式空間內(nèi)容恢復(fù)原樣,緩沖區(qū)的內(nèi)容?? --- 這里是將'#'標(biāo)記交換到hold space,便于下一次提取。
       };                           #
  n;                                #讀入下一行
  ba                               #跳轉(zhuǎn)到標(biāo)簽a處
};                                 #
p'                                 #輸出


PS. 請(qǐng)參考http://www.72891.cn/thread-3613371-1-1.html
http://www.72891.cn/thread-1762006-1-1.html
作者: cjaizss    時(shí)間: 2012-03-28 08:42
思路就是一直清{}
清到空為止
如果格式混亂些的話(huà),比如可能幾個(gè)并在一起寫(xiě),編程的時(shí)候就麻煩一點(diǎn)
作者: yuhuohu    時(shí)間: 2012-03-28 09:51
回復(fù) 31# yinyuemi


    謝!仔細(xì)的分析一個(gè)實(shí)例比看10頁(yè)理論還深刻




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