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
.0
ead 명령에 제공된 주소입니다 . 지정된 텍스트를 "라인 0 이후"(즉, 라인 1 이전)로 읽도록r
지시합니다 .ex
!head -n 1 file2
r
파일에서 직접 텍스트를 읽는 대신 (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.2
sed 버전을 확인하려면: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