파일 데이터의 일부를 다른 파일의 데이터로 바꾸고 싶습니다.
file1
아래와 같은 데이터가 있고 file2
시작 패턴과 끝 패턴을 저장하고 교체하려는 file1
데이터가 있다고 가정합니다 .file2
// +++ CUSTOMIZATION SETTINGS START +++
// +++ CUSTOMIZATION SETTINGS END +++
존재하다 file1
:
ANJALI
NISHA
// +++ CUSTOMIZATION SETTINGS START +++
WE WILL BE ON LEAVE FOR TODAY
// +++ CUSTOMIZATION SETTINGS END +++
PREETI
MONA
존재하다 file2
:
MANISH
MADHVI
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
NISHA
TUSHAR
출력 으로 file3
:
ANJALI
NISHA
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
PREETI
MONA
답변1
$ awk '/SETTINGS START/,/SETTINGS END/ {if (FNR==NR) {a=a"\n"$0}} FNR==NR{next} /SETTINGS START/{print substr(a,2)} /SETTINGS START/,/CUSTOMIZATION SETTINGS END/{next} 1' file2 file1
ANJALI NISHA
// +++ CUSTOMIZATION SETTINGS START +++
WELCOME ALL
// +++ CUSTOMIZATION SETTINGS END +++
PREETI MONA
설명하다
awk
파일을 한 줄씩 암시적으로 반복합니다. 이 예에서는 먼저 file2를 반복한 다음 file1을 반복합니다.
/SETTINGS START/,/SETTINGS END/ {if (FNR==NR) {a=a"\n"$0}}
file2의 설정은 부분적으로 변수에 캡처됩니다
a
.FNR==NR{next}
여전히 file2를 읽는 중이면 명령의 나머지 부분을 건너뛰고 다음 입력 줄로 이동합니다.
/SETTINGS START/{print substr(a,2)}
여기에 도착하면 file1을 처리하는 중입니다. 설정 섹션의 시작 부분이 보이면 변수에 저장한 문자열을 인쇄합니다
a
./SETTINGS START/,/CUSTOMIZATION SETTINGS END/{next}
file1의 설정 섹션에 있는 경우 나머지 명령을 건너뛰고 다음 입력 줄로 이동합니다.
1
1
현재 행을 인쇄하기 위한 awk의 신비한 속기입니다. 이 명령문은 설정 섹션이 아닌 file1에 있는 경우에만 표시됩니다.