sed를 사용하여 한 파일의 처음 n 줄을 다른 파일의 처음 n 줄로 바꿉니다(n=5로 가정).

sed를 사용하여 한 파일의 처음 n 줄을 다른 파일의 처음 n 줄로 바꿉니다(n=5로 가정).

라인을 교체하려고합니다 (파일 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명령이 실행되지 않습니다 .)dnextawk

  • 이것R표제(파일 이름을 사용하는 모든 명령과 마찬가지로) 파일 이름을 줄 바꿈으로 구분해야 합니다. 일반적인 ;명령 구분 기호는 무시되고 리터럴 " "로 끝나는 파일 이름 으로 R해석됩니다 . 공백과 동일하며 " " 텍스트로 끝나는 파일 이름 으로 해석됩니다 .R file2;;RR file2 ;;

  • R영향을 받지 -i않으므로파일 2변경되지 않습니다.

그것에 적응하기 위해한 줄, 줄바꿈과 연결되어 스크립트를 구성하는 두 개의 -e표현식을 전달할 수 있습니다 .sedsed

sed -i -e '1,5{R file2' -e 'd}' file1

그렇지 않으면 다음을 수행할 필요가 없습니다 sed.

{ head -n 5 file2; tail -n +6 file1; } > file3

일반적인 경우에는 $x1to $y1라인을 to 라인 file1으로 바꿉니다 .$x2$y2file2

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

관련 정보