2011-11-10 141 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 
相关问题