SED删除两个模式匹配之间的行

时间:2011-11-10 20:09:26

标签: sed

我正在尝试使用SED替换两个模式/字符串匹配之间的行,请参阅下文。我需要删除interface GigabitEthernet0/3以下interface GigabitEthernet0/4以下的行,但保留两个接口名称。

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
!

5 个答案:

答案 0 :(得分: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
!

Sed可以使用multi-line patterns。我们只使用c命令将匹配的模式(从interface GigabitEthernet0/3更改为!)与interface GigabitEthernet0/3!一起使用。

答案 1 :(得分: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

答案 2 :(得分:0)

这可能对您有用:

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

或正如您在问题中描述的那样:

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

假设您要在第二个界面之前保留行上的!。如果您不希望!然后从sed命令的最后一位省略/4/s/^/!\n/

答案 3 :(得分:0)

发布后我找到了答案:这是我的解决方案

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

答案 4 :(得分:0)

基本答案对我来说似乎很简单:

sed -e "/interface GigabitEthernet0\/3/p" \
    -e "/interface GigabitEthernet0\/4/p" \
    -e "/interface GigabitEthernet0\/3/,/interface GigabitEthernet0\/4/d" "$@"

打印与'interface GigabitEthernet0 / 3'匹配的行,以及包含'interface GigabitEthernet0 / 4'的行;删除两者之间的行。

唯一可能的问题是,如果存在'interface GigabitEthernet0 / 4'且没有前面的'interface GigabitEthernet0 / 3',那么该行将加倍。如果这是一个实际问题,那么请选择更复杂的脚本:

sed -e "/interface GigabitEthernet0\/3/,/interface GigabitEthernet0\/4/{
        /interface GigabitEthernet0\/3/p
        /interface GigabitEthernet0\/4/p
        d
        }" "$@"

如果你坚持它必须是一行,使用分号,但结果是难以理解的。