텍스트 파일을 구문 분석하고 특정 부분을 교체해야 합니다. 나는 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
인라인 편집 전에 원본 파일의 백업을 만듭니다.:a
a
다시 이동할 라벨을 만듭니다 .N
패턴 공간에 다음 입력 줄을 추가합니다.$!
마지막 줄만 아니었다면...ba
라벨로 돌아가기a
s///g
패턴 검색 및 바꾸기
더 간단한 솔루션 perl
:
perl -0777 -i.bak -pe "s/set cells \{.*\}/set cells{\n$cell_variable\n}/igs" file
-0777
Perl이 전체 파일을 삼키게 만듭니다.-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}/
: 모든 것을 나만의 셀 설정 명령으로 바꿉니다. 이 시점에서 {.*}를 포함한 전체 문을 읽어야 합니다.
도와주셔서 감사합니다