2

I am trying to replace lines between two pattern/string matches using SED see below. I need to delete lines below interface GigabitEthernet0/3 up to interface GigabitEthernet0/4, but leaving both interface names.

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
!

outcome:

interface GigabitEthernet0/2
 duplex full
 mls qos trust dscp
 spanning-tree portfast
!
interface GigabitEthernet0/3
!
interface GigabitEthernet0/4
 mls qos trust dscp
!
Brian Tillman
  • 21
  • 1
  • 2
  • Does this answer your question? [Using sed to delete all lines between two matching patterns](https://stackoverflow.com/q/6287755/608639) – jww Dec 23 '19 at 17:41

5 Answers5

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
Lri
  • 26,768
  • 8
  • 84
  • 82
1

Income:

$> 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
!

Outcome:

$> 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 can work with multi-line patterns. We just use c command which is changing matched pattern (from interface GigabitEthernet0/3 to !) with interface GigabitEthernet0/3 and !.

0

This might work for you:

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

or as you described it in the question:

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

presuming you want to preserve the ! on the line prior to the second interface. If you don't want the ! then omit /4/s/^/!\n/ from the last bit of the sed command

potong
  • 55,640
  • 6
  • 51
  • 83
0

after posting I found my answer: here's my solution

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

Then I just add back interface 0/3 with

sed -e '/interface\ GigabitEthernet0\/4/ i\
interface\ GigabitEthernet0\/3\
 description\ NOT USED\
 shutdown\
!' $filesw.tmp.1 > $filesw.tmp.2
Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278
Brian Tillman
  • 21
  • 1
  • 2
0

The basic answer seems simple to me:

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

Print lines matching 'interface GigabitEthernet0/3', and lines containing 'interface GigabitEthernet0/4'; delete the lines between and including the two.

The only possible issue is that if there is 'interface GigabitEthernet0/4' and no preceding 'interface GigabitEthernet0/3', then that line will be doubled up. If that's an actual problem, then go for a more complex script:

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

If you're adamant it must be one line, use semicolons, but the result is illegible.

Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278