用递增值替换匹配单词后的单词

用递增值替换匹配单词后的单词

我有一个这样的文件 -

   !
   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

    这是 awk 对 print-the-line 的神秘简写。

要就地更改文件,假设您使用的是现代 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

相关内容