파일의 패턴을 두 번째 파일의 패턴으로 바꿉니다.

파일의 패턴을 두 번째 파일의 패턴으로 바꿉니다.

파일 데이터의 일부를 다른 파일의 데이터로 바꾸고 싶습니다.

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에 있는 경우에만 표시됩니다.

관련 정보