이런 파일이 있어요 -
!
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