sed 모드 및 여러 줄 교체

sed 모드 및 여러 줄 교체

텍스트 파일을 구문 분석하고 특정 부분을 교체해야 합니다. 나는 sed이것이 그렇게 하는 방법이라고 생각 하지만 여러 행을 처리하는 방법을 잘 모르겠습니다.

내가 찾는 패턴은

set cells { \  
cell1 \  
cell2 \  
cell3 \  
}

변수의 내용으로 바꾸고 싶습니다.

다음과 같은 것이 트릭을 수행해야 하지만 여러 줄에서는 작동하지 않습니다. 어떤 아이디어가 있나요?

sed "s/set cells {.*}/set cells {$cell_variable}/" file

답변1

다음과 같은 경우 sed:

sed -i.bak ':a;N;$!ba;s/set cells {.*}/set cells{\n'$cell_variable'\n}/g' file
  • -i.bak인라인 편집 전에 원본 파일의 백업을 만듭니다.
  • :aa다시 이동할 라벨을 만듭니다 .
  • N패턴 공간에 다음 입력 줄을 추가합니다.
  • $!마지막 줄만 아니었다면...
    • ba라벨로 돌아가기a
  • s///g패턴 검색 및 바꾸기

더 간단한 솔루션 perl:

perl -0777 -i.bak -pe "s/set cells \{.*\}/set cells{\n$cell_variable\n}/igs" file
  • -0777Perl이 전체 ​​파일을 삼키게 만듭니다.
  • -i.bak인라인 편집 전에 원본 파일의 백업을 만듭니다.

답변2

Perl을 추가 도구로 사용하는 것을 피하고 싶습니다. 어떤 이유로 카오스 솔루션이 제대로 작동하지 못했지만 sed에서 일부 내용을 읽은 후 대안을 생각해 냈습니다.

sed "/set cells/!b; :Loop; N; /}/!b Loop; s/.*/set cells {$cell_def}/" -i file
  • /set cells/!b: 설정된 셀을 찾아, 찾지 못한 경우 다음 행으로 이동
  • :Loop: 여러 줄을 병합하는 데 사용되는 레이블
  • N: 다음 줄 추가
  • /}/!b Loop:Search}를 찾을 수 없으면 Loop 레이블을 반환합니다. 효과적으로 루프는 }를 찾을 때까지 새 줄을 읽습니다.
  • s/.*/set cells {$cell_def}/: 모든 것을 나만의 셀 설정 명령으로 바꿉니다. 이 시점에서 {.*}를 포함한 전체 문을 읽어야 합니다.

도와주셔서 감사합니다

관련 정보