일치하는 단어 뒤의 단어를 증가하는 값으로 바꿉니다.

일치하는 단어 뒤의 단어를 증가하는 값으로 바꿉니다.

이런 파일이 있어요 -

   !
   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

관련 정보