我有一个这样的文件 -
!
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