N명령을 통해

N명령을 통해

나는 다음 SED 명령을 사용하여 한 파일을 다른 파일의 첫 번째 줄로 삽입하려고 시도했지만 큰 성공을 거두지 못했습니다. 매번 라인 1 뒤에 파일을 삽입하십시오. 1호선 앞에 삽입할 스위치가 있나요?

sed -i '1r file1.txt' file2.txt

미리 감사드립니다.

답변1

N명령을 통해

file2.txt두 개 이상의 줄이 있는 경우 (그렇지 않은 경우 다른 섹션 참조):

sed -i -e '1 { r file1.txt' -e 'N; }' file2.txt

비결은 N명령을 사용하여 첫 번째 줄의 인쇄를 연기하는 것입니다.

매뉴얼에서:

질소

패턴 공간에 다음 입력 줄을 추가합니다.

e명령을 통해

전제 file2.txt는 비어 있지 않다는 것입니다(그렇지 않으면 그냥 복사본을 만드십시오).

sed -i -e '1 e cat file1.txt' file2.txt

GNU는 인수에 지정된 명령을 실행하는 명령을 sed제공합니다 . e결과는 즉시 출력됩니다.

매뉴얼에서:

전자 [명령어]

이 명령을 사용하면 쉘 명령의 입력을 패턴 공간으로 파이프할 수 있습니다. 인수가 없으면 'e' 명령은 패턴 공간에 있는 명령을 실행하고 패턴 공간을 출력으로 바꿉니다.

대신 인수가 지정되면 "e" 명령은 이를 명령으로 해석하고 해당 출력을 출력 스트림으로 보냅니다.

"r" 명령과 달리 이 명령의 출력은 즉시 인쇄되지만 "r" 명령은 현재 기간이 끝날 때까지 출력을 지연합니다.

답변2

sed명령은 r입력의 다음 줄을 읽기 전에 지정된 파일의 내용을 출력에 넣습니다. 불행하게도 이 명령에 주소를 지정할 수 없으므로 0입력의 첫 번째 줄 앞에 파일 내용을 삽입할 수 없습니다(예약된 공간을 사용하지 않고).

그러나 결국에는 일반 old 를 사용할 수 있습니다 cat.이것파일을 연결하는 명령:

$ cat file1.txt file2.txt >out && mv out file2.txt

쓰고 있는 임시 파일이 이미 존재하지 않는지 확인하려면 다음 mktemp유틸리티를 사용할 수 있습니다.

$ tmp="$(mktemp)" && cat file1.txt file2.txt >"$tmp" && mv "$tmp" file2.txt

이는 명령줄에서는 다소 어색하지만 임시 파일에 써야 하는 스크립트에서는 좋은 예방 조치입니다.

답변3

명시적인 임시 파일에 액세스 하지 않기로 결정한 경우 cat(또는 이와 같은 버퍼를 통해 ) 적어도 명령으로 0 주소를 허용하는 sponge것처럼 보입니다 .edr

ed -s file2.txt << EOF
0r file1.txt
wq
EOF

또는 동등하게

printf '0r file1.txt\nwq\n' | ed -s file2.txt

답변4

동일한 디렉토리의 여러 파일 위에 동일한 파일을 삽입하려는 경우 다음을 기반으로 합니다.코살로난다의 답변사용될 수있다:

for i in file*; do tmp="$(mktemp)" && cat file1 $i >"$tmp" && mv "$tmp" $i; done

관련 정보