2011-11-10 2 views
2

SEDを使用して2つのパターン/ストリングマッチの間の行を置換しようとしています。私はinterface GigabitEthernet0/3以下の行をinterface GigabitEthernet0/4まで削除する必要がありますが、両方のインターフェイス名は残しておきます。SEDは2つのパターンマッチの間の行を削除します

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で作業することができます。一致するパターン(interface GigabitEthernet0/3から!まで)をinterface GigabitEthernet0/3!に変更しているcコマンドを使用します。

0

これはあなたのために働くかもしれない:

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

またはあなたが質問でそれを説明したように:

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

はあなたが前に第2のインタフェースにライン上!を保持したい前提。あなたは!その後、投稿後の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'を含む行に一致する行を印刷します。 2つの間の行を削除します。

唯一の問題は、「interface GigabitEthernet0/4」があり、かつ「interface GigabitEthernet0/3」が先行していない場合、その回線が倍増することです。それは実際の問題だ場合には、より複雑なスクリプトのために行く:あなたは断固としている場合は

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

それは、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 
関連する問題