패턴과 일치하는 여러 파일의 줄을 다른 파일의 줄로 순차적으로 교체

패턴과 일치하는 여러 파일의 줄을 다른 파일의 줄로 순차적으로 교체

여러 파일의 패턴과 일치하는 줄을 다른 파일에서 순차적으로 바꾸고 싶습니다. 구조는 최대 500개의 txt 파일입니다. Test1.txt, Test2.txt, Test3.txt...

11111
22222
mock
55555
77777

따라서 파일을 하나씩 읽어서 첫 번째 test1.txt 파일의 모의 행을 mock.txt 파일의 첫 번째 행으로 바꾸고 두 번째 test2.txt 파일의 모의 행을 mock.txt 파일로 바꾸고 싶습니다. in 의 구조는 다음과 같습니다.

시뮬레이션.txt

randomText1
randomText2
randomText3
randomText4
randomText5

폴더의 마지막 .txt 파일까지 계속됩니다.

답변1

GNU sed를 사용하면 다음을 사용할 수 있습니다.

cat mock.txt | sed -i -e '/mock/{R/dev/stdin' -e 'd;}' test{1..3}.txt

R읽기 및 삽입을 위한 GNU 특정 명령하나의r모든 것을 삽입하는 표준 옵션과 달리 한 번에 한 줄씩 .

$ head test{1..3}.txt
==> test1.txt <==
11111
22222
randomText1
55555
77777

==> test2.txt <==
11111
22222
randomText2
55555
77777

==> test3.txt <==
11111
22222
randomText3
55555
77777
R filename

현재 주기가 끝날 때나 다음 입력 줄을 읽을 때 읽을 파일 이름 줄을 출력 스트림에 대기열에 추가하고 삽입합니다. 파일 이름을 읽을 수 없거나 끝에 도달하면 줄이 추가되지 않으며 오류 표시도 나타나지 않습니다.

r 명령과 마찬가지로 파일 이름은 표준 입력에서 한 줄을 읽는 특수 값 /dev/stdin을 지원합니다.

이 경우 파일에서 직접 행을 읽는 것은 작동하지 않습니다 /mock/R mock.txt. 왜냐하면 옵션은 옵션을 -i암시하므로 -s첫 번째 행이 mock.txt각 파일에 삽입되기 때문입니다.

답변2

GNU awk(예: gawk)를 사용하면 다음을 수행할 수 있습니다.

gawk -i inplace '/mock/ { getline < "mock.txt" } 1' test{1..3}.txt

sed와 마찬가지로 gawk내부 편집이 제공됩니다. 위 명령은 regex-pattern 을 찾고 mock이를 찾으면 regex-pattern 의 다음 줄로 바꿉니다 mock.txt. 이는 1항상 일치하는 패턴이므로 gawk(새로) 읽은 줄을 인쇄하는 기본 작업이 수행됩니다. 내부 편집 중에는 실제로 이 줄이 표시되지 않습니다. 출력을 기록하려면 인쇄 작업이 필요합니다.

관련 정보