나는 다음 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
것처럼 보입니다 .ed
r
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