한 파일의 첫 번째 줄을 다른 파일의 첫 번째 줄에 삽입하는 방법은 무엇입니까?

한 파일의 첫 번째 줄을 다른 파일의 첫 번째 줄에 삽입하는 방법은 무엇입니까?

head파일의 첫 번째 줄을 가져오는 명령과 sed파일의 첫 번째 줄 앞에 삽입하는 명령이 있습니다 . 다른 파일에서 추출된 첫 번째 줄 앞에 한 파일에서 추출된 첫 번째 줄을 삽입할 수 있도록 이들을 어떻게 결합할 수 있습니까?

파일의 첫 번째 줄을 가져옵니다

head -n 1 file_to_get_first_line_from

첫 번째 행 앞에 삽입

sed -i '1 i\insert_this_in_the_first_line' file_to_intert_into

답변1

file_to_insert_into끝이 개행 문자가 아닌 경우 :

$ cat <<IN > file_to_insert_into
$(head -n1 file_to_get_first_line_from; cat file_to_insert_into)
IN

답변2

가장 휴대성이 좋은 방법은 다음과 같습니다.POSIX 지정 함수ex.

$ cat file1
Jack and Jill
Went up the hill
To fetch a pail of water.

$ cat file2
Nursery Rhymes:
Epic Poems:
Classic Literature:

$ printf '%s\n' '0r !head -n 1 file2' x | ex file1

$ cat file1
Nursery Rhymes:
Jack and Jill
Went up the hill
To fetch a pail of water.
  • printf에 명령을 보내는 데 사용됩니다 ex.
  • 0ead 명령에 제공된 주소입니다 . 지정된 텍스트를 "라인 0 이후"(즉, 라인 1 이전)로 읽도록 r지시합니다 .ex

  • !head -n 1 file2r파일에서 직접 텍스트를 읽는 대신 (a모두파일), head먼저 명령을 실행하고 해당 출력(지정된 위치, 라인 0)을 읽습니다.

  • x저장하고 종료한다는 의미입니다.

이는 POSIX와 완전히 호환되며 이식 가능합니다.


이 스크립트를 작성하는 경우 가정을 확인하는 것이 좋습니다. 존재 file2하고 읽을 수 있으며, file1존재하는 경우 읽고 쓸 수 있습니다.

if [ -r file2 ] && [ -f file2 ] && { ! [ -e file1 ] || { [ -r file1 ] && [ -w file1 ];};}; then
  printf '%s\n' '0r !head -n 1 file2' x | ex file1
fi

답변3

Vim을 사용하고 다음을 수행하십시오 head.

vim -Nesc '0r !head -n1 file_to_get_first_line_from' +wq file_to_insert_into
  • -Nes호환되지 않는 자동 ex 모드를 활성화합니다. Vim을 사용하여 작업을 스크립팅할 때 유용합니다.
  • -c '0r !<cmd>'<cmd>첫 번째 줄 앞에 명령 출력을 삽입합니다. 여기서의 명령은 물론 head명령입니다.
  • +wq파일을 저장하고 닫습니다.

답변4

고쳐 쓰다: GNU Sed의 차이점을 지적해준 @Wildcard에게 감사드립니다.

노스 다코타sed

터미널에서 다음을 시도해 보세요.

sed -i '' "1i\
$(head -n 1 file_to_get_first_line_from)" file_to_insert_into
  • 이는 입력을 시작한 sed -i '' "1i\다음 Enter를 눌러 나머지 명령을 계속한다는 의미입니다.

설명하다

  • Bash 명령 대체를 사용하여 두 개의 원래 명령을 결합합니다 $( ). $( )내부의 bash 명령을 해당 출력으로 바꿉니다.
  • sed 명령을 올바르게 보기 위해 따옴표를 계속 사용하면서 Bash가 작업을 수행할 수 있도록 '리터럴 따옴표를 따옴표로 변경했습니다 ."sed

암소 비슷한 일종의 영양sed

또는 GNU sed가 있는 경우:

sed -i "1i $(head -n 1 file_to_get_first_line_from)" file_to_insert_into
  • 테스트 목적으로 sed (GNU sed) 4.2.2sed 버전을 확인하려면:sed --version
  • GNU sed는 \개행 문자를 생략할 수 있습니다. info sed, 아래에 sed Programs, Common Commands:

GNU 확장으로서 'a'와 개행 문자 사이에 공백'\' 이외의 다른 시퀀스가 ​​있는 경우 'a' 다음에 공백이 아닌 첫 번째 문자로 시작하는 텍스트 줄이 간주됩니다. TEXT 블록. (이것은 한 줄 추가 스크립트 작성을 단순화할 수 있습니다.) 이 확장은 "i" 및 "c" 명령에서도 작동합니다.

추가 정보

  • 또는 head 명령의 더 짧은 버전도 있습니다: head -1. 그러나 info head이것이 obsolete option syntax -[NUM]...head에서 지원된다고 주장하고 해당 구문을 사용하기 위해 "표준 호스트"를 권장하므로 여기서는 원래 구문을 -n NUM계속 사용할 수 있습니다.head -n 1

관련 정보