라인을 교체하려고합니다 (파일 1)는 다른 파일과 동일한 행 수와 동일한 위치를 갖습니다(파일 2). 내가 찾은
sed -n 1,5p file2
에서 처음 5개 행을 추출합니다.파일 2. 이 줄을 가져와서 처음 5개를 바꾸려면 어떻게 해야 합니까?파일 1?
답변1
GNU를 사용하여 내부 편집을 위한 옵션이 sed
있습니다 -i
. 이것R
표제명령(이름이 지정된 파일에서 한 줄을 읽은 다음 다시 실행할 때 해당 줄 뒤의 모든 줄을 읽음)이 여기에서 유용합니다. 두 줄 버전:
sed -i '1,5{R file2
d}' file1
노트:
R
표제의 출력d
에일렛다음.R
각 행을 삽입파일 2 뒤쪽에d
다음에서 행 삭제파일 1. 먼저 갈 수 없습니다 . ( 먼저d
가면 에서처럼R
명령이 실행되지 않습니다 .)d
next
awk
이것
R
표제(파일 이름을 사용하는 모든 명령과 마찬가지로) 파일 이름을 줄 바꿈으로 구분해야 합니다. 일반적인;
명령 구분 기호는 무시되고 리터럴 " "로 끝나는 파일 이름 으로R
해석됩니다 . 공백과 동일하며 " " 텍스트로 끝나는 파일 이름 으로 해석됩니다 .R file2;
;
R
R file2 ;
;
R
영향을 받지-i
않으므로파일 2변경되지 않습니다.
그것에 적응하기 위해한 줄, 줄바꿈과 연결되어 스크립트를 구성하는 두 개의 -e
표현식을 전달할 수 있습니다 .sed
sed
sed -i -e '1,5{R file2' -e 'd}' file1
그렇지 않으면 다음을 수행할 필요가 없습니다 sed
.
{ head -n 5 file2; tail -n +6 file1; } > file3
일반적인 경우에는 $x1
to $y1
라인을 to 라인 file1
으로 바꿉니다 .$x2
$y2
file2
sed "$x2,\$!d;$y2 q" file2 | sed -i -e "$x1 r /dev/stdin" -e "$x1,$y1 d" file1
또는:
{
head -n "$((x1 - 1))"
tail -n "+$x2" < file2 | head -n "$((y2 - x2 + 1))"
tail -n "+$((y1 - x1 + 2))"
} < file1 > file3
답변2
약간의 치트(순수하지 않음 sed
)를 사용하세요.sponge
:
{ sed -n 1,5p file2 ; sed -n '6,$p' file1 } | sponge file1
답변3
tmp 파일을 사용하는 것은 어떻습니까?
sed -n ‘1,5p’ file2 > file3 ; sed ‘1,5d’ file1 >> file3 ; mv file3 file1