![다른 줄에서 시작하고 끝나는 패턴 간 바꾸기](https://linux55.com/image/64769/%EB%8B%A4%EB%A5%B8%20%EC%A4%84%EC%97%90%EC%84%9C%20%EC%8B%9C%EC%9E%91%ED%95%98%EA%B3%A0%20%EB%81%9D%EB%82%98%EB%8A%94%20%ED%8C%A8%ED%84%B4%20%EA%B0%84%20%EB%B0%94%EA%BE%B8%EA%B8%B0.png)
다음 형식의 파일이 있습니다.
Whatever1
Whatever2
Whatever3
binaries=(
text1
bin2
ohhh3
)
Whatever4
Whatever5
Whatever6
binaries=(
내부 라인을 명령 출력으로 바꿔야 합니다 .)
다음과 같은 명령을 사용하여 다음 블록을 선택할 수 있습니다 sed -n -e '/binaries=(/,/)/p' filename
.
binaries=(
text1
bin2
ohhh3
)
아니면 다음을 사용하는 것이 더 좋습니다 awk '/binaries/,/)/{if(!/binaries|)/)print}' filename
:
text1
bin2
ohhh3
그런데 원본 파일을 다시 작성해야 하는데 어떻게 진행해야 할지 모르겠습니다.
답변1
GNU 사용 sed
:
sed '/binaries=(/,/)/{
//!d
/)/e uname
}'
귀하의 명령으로 바꾸십시오 uname
.
답변2
예를 들어 다음과 같이 awk를 사용합니다.
awk '
f && /)/ { f=0 }
!f
!f && /binaries=\(/ { f=1 ; p=1 }
p { system ("your_command") ; p=0 }
'
여기서 "your_command"는 대체를 정의합니다.
설명: 이 플래그는 f
상태 머신을 제어합니다. 설정된 경우 교체해야 하는 블록에 있습니다. 시작 패턴과 끝 패턴이 일치하면 그에 따라 플래그가 변경됩니다. 블록 내부에 있는 동안 시스템 호출이 실행됩니다. 이 플래그는 p
한 번만 인쇄하는 데 사용됩니다.
원본 파일을 바꾸려면 새 파일을 만들고 원본 파일을 덮어쓰거나 awk
최신 버전의 GNU를 옵션과 함께 사용하세요 -i inplace
.