我正在尝试使用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
!
答案 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/3sed -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
}" "$@"
如果你坚持它必须是一行,使用分号,但结果是难以理解的。