一致する単語の後の単語を増加する値に置き換えます。

一致する単語の後の単語を増加する値に置き換えます。

このようなファイルがあります -

   !
   interface csa2549abA
   xxxx
   yyyy
   zzzz
   !
   interface aso23apwoeAe
   aaa
   bbb
   ccc
   !
   interface FastEthernet0/1
   ppp
   qqq
   rrr
   !

など。

私が望むのは、interfacesハッシュのように見える名前をより一貫性のある名前に変更することです。言葉にならないものではありませんそしてこのように出力してみてください。意味のあるものと意味のないものの主な違いは、ハッシュの名前の間に数字があることです。意味のあるものは常に数字で終わります。出力は次のようにする必要があります -

   !
   interface ethernet1
   xxxx
   yyyy
   zzzz
   !
   interface ethernet2
   aaa
   bbb
   ccc
   !
   interface FastEthernet0/1
   ppp
   qqq
   rrr
   !

など。各インターフェースは用語の価値の増加にすぎませんethernet。また、それぞれ入力として使用できるファイルが複数あるとします。

今持っているのは、sed -i 's/^interface .*$/interface Ethernet/' *各インターフェイスの値をイーサネットに置き換えるだけです。Ethernet私が望むものを表現するために最後の部分だけを追加するコマンドがあるかどうか疑問に思います。

答え1

算術演算が必要なsedのでいいえ正しいツール。以下の解決策を使用してくださいawk

修正された質問に答えてください

数字の後に文字が常に含まれるようにハッシュ値の名前は必要ではないと言われました。この場合:

$ awk '/^interface .*[[:digit:]][[:alpha:]]/{$0="interface ethernet" ++f} 1' file1
!
interface ethernet1
xxxx
yyyy
zzzz
!
interface ethernet2
aaa
bbb
ccc
!
interface FastEthernet0/1
ppp
qqq
rrr
!

仕組み:

  • /^interface .*[[:digit:]][[:alpha:]]/

    interfaceこれは数字と文字で始まり、その後に数字と文字を含む行のみが選択されます。

  • $0="interface ethernet" ++f

    上記のように選択された行は数字に変わりinterface ethernet、毎回数字が増加します。

  • 1

    これはprint-the-lineのawkの神秘的な速記です。

最新のGNU awkを使用していると仮定し、ファイルをその場で変更するには、次のようにします。

awk -i inplace '/^interface .*[[:digit:]][[:alpha:]]/{$0="interface ethernet" ++f} 1' file1

元の質問に答える

$ awk '/^interface /{$0="interface ethernet" ++f} 1' file
!
interface ethernet1
xxxx
yyyy
zzzz
!
interface ethernet2
aaa
bbb
ccc
!

現在の場所でファイルを変更し、最新のGNU awkを想定するには、次のようにします。

awk -i inplace '/^interface /{$0="interface ethernet" ++f} 1' file

関連情報