여러 파일의 패턴과 일치하는 줄을 다른 파일에서 순차적으로 바꾸고 싶습니다. 구조는 최대 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
(새로) 읽은 줄을 인쇄하는 기본 작업이 수행됩니다. 내부 편집 중에는 실제로 이 줄이 표시되지 않습니다. 출력을 기록하려면 인쇄 작업이 필요합니다.