2011-11-10 369 views
2

我想使用SED替換兩個模式/字符串匹配之間的行,請參閱下文。我需要刪除interface GigabitEthernet0/3以下的行,直到interface GigabitEthernet0/4,但保留兩個接口名稱。SED刪除兩個模式匹配之間的行

interface GigabitEthernet0/2 
duplex full 
mls qos trust dscp 
spanning-tree portfast 
! 
interface GigabitEthernet0/3 
mls qos trust dscp 
spanning-tree portfast 
! 
interface GigabitEthernet0/4 
mls qos trust dscp 
! 

結果:

interface GigabitEthernet0/2 
duplex full 
mls qos trust dscp 
spanning-tree portfast 
! 
interface GigabitEthernet0/3 
! 
interface GigabitEthernet0/4 
mls qos trust dscp 
! 

回答

1

收入:

$> cat ./text 
interface GigabitEthernet0/2 
duplex full 
mls qos trust dscp 
spanning-tree portfast 
! 
interface GigabitEthernet0/3 
mls qos trust dscp 
spanning-tree portfast 
! 
interface GigabitEthernet0/4 
mls qos trust dscp 
! 

結果:

$> cat ./text | sed '/interface GigabitEthernet0\/3/,/\!/c interface GigabitEthernet0\/3\n!' 
interface GigabitEthernet0/2 
duplex full 
mls qos trust dscp 
spanning-tree portfast 
! 
interface GigabitEthernet0/3 
! 
interface GigabitEthernet0/4 
mls qos trust dscp 
! 

桑達可以multi-line patterns工作。我們只使用c命令,它將interface GigabitEthernet0/3!的匹配模式(從interface GigabitEthernet0/3!)更改。

0

這可能會爲你工作:

sed -e '\#^interface GigabitEthernet0/3#,/^!/{//!d}' input_file 

或者你在問題中描述的那樣:

sed -e '\#^interface GigabitEthernet0/3#,\#^interface GigabitEthernet0/4#{//!d;/4/s/^/!\n/}' input_file 

假設你想保留在之前的第二個接口就行了!。如果你不希望!然後sed命令

0

的最後一位省略/4/s/^/!\n/發佈,我發現我的答案後:這裏是我的解決方案

cat somerouter.config | sed '/interface GigabitEthernet0\/3/,/interface GigabitEthernet0\/4/{/^interface GigabitEthernet0\/4/p;d;}' somerouter.config > somenewerrouter.config 

然後我再補充背部接口0/3與

sed -e '/interface\ GigabitEthernet0\/4/ i\ 
interface\ GigabitEthernet0\/3\ 
description\ NOT USED\ 
shutdown\ 
!' $filesw.tmp.1 > $filesw.tmp.2 
0

最基本的答案似乎很簡單對我說:

sed -e "/interface GigabitEthernet0\/3/p" \ 
    -e "/interface GigabitEthernet0\/4/p" \ 
    -e "/interface GigabitEthernet0\/3/,/interface GigabitEthernet0\/4/d" "[email protected]" 

打印與'interface GigabitEthernet0/3'匹配的線路和包含'interface GigabitEthernet0/4'的線路;刪除兩者之間的連線。

唯一可能的問題是,如果有'接口千兆以太網0/4'並且沒有'接口千兆以太網0/3',那麼這條線將會翻倍。如果這是一個實際的問題,然後去一個更復雜的腳本:

sed -e "/interface GigabitEthernet0\/3/,/interface GigabitEthernet0\/4/{ 
     /interface GigabitEthernet0\/3/p 
     /interface GigabitEthernet0\/4/p 
     d 
     }" "[email protected]" 

如果你堅決它必須在同一行,用分號,但結果是難以辨認。

1
$ cat test 
1 
start 
2 
end 
3 
$ sed -n '1,/start/p;/end/,$p' test 
1 
start 
end 
3 
$ sed '/start/,/end/d' test 
1 
3 
相關問題