한 파일의 문자열을 다른 파일의 전체 내용으로 바꾸는 sed(또는 awk) 명령을 작성하고 싶습니다. [중복]을 확인하세요.

한 파일의 문자열을 다른 파일의 전체 내용으로 바꾸는 sed(또는 awk) 명령을 작성하고 싶습니다. [중복]을 확인하세요.
cat file.txt 
TEXT1 TEST2 TEST3
cat other_file.txt 
there are multiple lines1.
there are multiple lines2.
there are multiple lines3

나는 다음과 같은 출력을 원합니다.

cat file3.txt 
there are TEXT1 TEST2 TEST3 lines1
there are TEXT1 TEST2 TEST3 lines2
there are TEXT1 TEST2 TEST3 lines3

multiple키워드를 각 줄의 파일에 있는 모든 내용으로 바꾸십시오. 이것이 명확해지기를 바랍니다.

답변1

테스트되지 않음:

sed '1h;1d;G;s/multiple\(.*\)\n\(.*\)/\2\1/;P;d' file.txt other_file.txt > file3.txt

제가 설명할 필요가 있나요?

답변2

를 사용하면 GNU Awk 5.1.0아래 코드가 설명하는 내용을 생성합니다.

cat file1
TEXT1 TEST2 TEST3

cat file2
there are multiple lines1.
there are multiple lines2.
there are multiple lines3.

awk 'NR==FNR{a=$0;next}{$3=a}1' file1 file2
there are TEXT1 TEST2 TEST3 lines1.
there are TEXT1 TEST2 TEST3 lines2.
there are TEXT1 TEST2 TEST3 lines3.

간단한 설명:
NR==FNR:awk NR(전역 레코드 수)을 FNR(처리된 파일의 레코드 수)과 비교하는 빠른 방법입니다. 첫 번째 파일의 경우에만 NR은 FNR과 같습니다.

a=$0: $0전체 레코드/행을 저장하고 이라는 변수에 저장합니다.a

next: awk파일의 다음 레코드/라인을 읽는다는 것을 나타냅니다.

따라서 코드의 이 부분은 awk에 대한 첫 번째 파일 입력인 file1에 대해서만 실행됩니다.
NR==FNR{a=$0;next}
추신: 첫 번째 파일에 두 줄 이상이 있으면 변수는 afile1의 마지막 레코드/줄의 내용을 보유합니다.

이 코드는 두 번째 파일(file2)에서 실행됩니다.
{$3=a}1

$3=a: $3(입력의 세 번째 필드)를 변수의 내용으로 바꿉니다 a. 분명히 이 솔루션은 단어가 항상 file2 입력 줄의 세 번째 필드에 있지 않으면 multiple실패합니다 .
또는 유사한 방법을 사용하여 literal이라는 단어를 변수의 내용으로 {sub("multiple",a)}1바꿀 수 있습니다 .multiplea

1: 현재 레코드/라인만 인쇄

관련 정보