このようなファイルがあります -
!
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