[unix] 파일 앞에 텍스트를 추가하는 Unix 명령

텍스트 파일에 일부 문자열 데이터를 추가하는 Unix 명령이 있습니까?

다음과 같은 것 :

prepend "to be prepended" text.txt



답변

sed -i.old '1s;^;to be prepended;' inFile
  • -i변경 사항을 기록하고 확장이 제공되면 백업을 수행합니다. (이 경우 .old)
  • 1s;^;to be prepended;;명령 구분 기호로 사용하여 첫 번째 줄의 시작 부분을 지정된 대체 문자열로 대체합니다 .

답변

printf '%s\n%s\n' "to be prepended" "$(cat text.txt)" >text.txt


답변

프로세스 대체

아무도 이것을 언급하지 않았다는 것에 놀랐습니다.

cat <(echo "before") text.txt > newfile.txt

이것은 받아 들여진 대답보다 더 자연 스럽습니다 (무언가를 인쇄하고이를 대체 명령에 연결하는 것은 사 전적으로 반 직관적입니다).

… 위에서 라이언이 말한 것을 납치 sponge하면 임시 파일이 필요하지 않습니다.

sudo apt-get install moreutils
<<(echo "to be prepended") < text.txt | sponge text.txt

편집 : Bourne Shell에서 작동하지 않는 것 같습니다. /bin/sh


Here String (zsh 전용)

here-string-사용하여 <<<다음을 수행 할 수 있습니다.

<<< "to be prepended" < text.txt | sponge text.txt


답변

이것은 한 가지 가능성입니다.

(echo "to be prepended"; cat text.txt) > newfile.txt

중간 파일을 쉽게 다룰 수 없을 것입니다.

대안 (셸 이스케이프로 인해 번거로울 수 있음) :

sed -i '0,/^/s//to be prepended/' text.txt


답변

이것은 출력을 형성하는 데 작동합니다. -는 에코에서 파이프를 통해 제공되는 표준 입력을 의미합니다.

echo -e "to be prepended \n another line" | cat - text.txt

파일을 다시 쓰려면 입력 파일로 다시 파이프 할 수 없으므로 임시 파일이 필요합니다.

echo "to be prepended" | cat - text.txt > text.txt.tmp
mv text.txt.tmp text.txt


답변

Adam ‘s 선호 답변

스펀지 를 사용하기 쉽게 만들 수 있습니다 . 이제 임시 파일을 만들고 이름을 바꿀 필요가 없습니다.

echo -e "to be prepended \n another line" | cat - text.txt | sponge text.txt


답변

입력 파일 을 교체 할 수 있는 경우 :

노트 :

  • 그렇게하면 예상치 못한 부작용이 발생할 수 있습니다. 특히 심볼릭 링크를 일반 파일로 대체하고 파일에 대한 다른 권한을 갖게되며 파일 생성 (생년월일) 날짜가 변경 될 수 있습니다.

  • sed -i, Prince John Wesley의 답변 에서와 같이 최소한 원래 권한을 복원하려고 시도하지만 다른 제한 사항도 적용됩니다.

다음 은 임시 파일을 사용 하는 간단한 대안입니다 ( shime의 솔루션 이 수행 하는 방식으로 전체 입력 파일을 메모리로 읽는 것을 방지합니다 ).

{ printf 'to be prepended'; cat text.txt; } > tmp.txt && mv tmp.txt text.txt

사용하여 그룹 명령은 ( { ...; ...; })를 사용하는 것보다 약간 더 효율적입니다 서브 쉘을 ( (...; ...)같이) 0xC0000022L의 솔루션 .

장점은 다음과 같습니다.

  • 그것은 새로운 텍스트를 직접 첫 번째 줄 앞에 추가할지 여부를 제어하기 쉽게하거나 삽입 할 것인지 등의 새로운 라인 (들) (단순히 APPEND \n받는 printf인수).

  • sed솔루션 과 달리 입력 파일이 비어 있으면 ( 0바이트) 작동합니다.


sed솔루션은 의도는 하나 개 이상의 앞에 추가하는 경우 간단하게 할 수있는 전체 라인을 (입력 파일이 비어 있지 가정) 기존 내용 :

sedi함수는 전체 행을 삽입합니다.

GNU sed :

# Prepends 'to be prepended' *followed by a newline*, i.e. inserts a new line.
# To prepend multiple lines, use '\n' as part of the text.
# -i.old creates a backup of the input file with extension '.old'
sed -i.old '1 i\to be prepended' inFile

macOS / BSD에서도 작동하는 휴대용 변형 sed:

# Prepends 'to be prepended' *followed by a newline*
# To prepend multiple lines, escape the ends of intermediate
# lines with '\'
sed -i.old -e '1 i\
to be prepended' inFile

뒤에 오는 리터럴 개행 문자 \가 필요합니다.


입력 파일 을 제자리에서 편집해야하는 경우 (모든 속성과 함께 inode 유지) :

오래된 edPOSIX 유틸리티 사용 :

노트 :

  • ed항상 입력 파일 전체 를 메모리로 먼저 읽습니다 .

첫 번째 줄에 직접 추가 하려면 (와 마찬가지로 sed입력 파일이 완전히 비어 있으면 ( 0바이트) 작동하지 않음 ) :

ed -s text.txt <<EOF
1 s/^/to be prepended/
w
EOF
  • -sed의 상태 메시지를 억제했습니다 .
  • 명령이 ed여러 줄의 here-document ( <<EOF\n...\nEOF), 즉 stdin을 통해 제공되는 방법에 유의 하십시오 . 기본적으로 문자열 확장 이러한 문서에서 수행됩니다 (쉘 변수는 보간됩니다). 이를 억제하려면 여는 구분 기호를 인용 하십시오 (예 🙂 <<'EOF'.
  • 1 첫 번째 줄을 현재 줄로 만듭니다.
  • 함수 s는 다음과 같이 현재 줄에서 정규식 기반 문자열 대체를 수행합니다 sed. 대체 텍스트에 리터럴 개행 문자를 포함 할 수 있지만\ 이스케이프 처리 .
  • w(테스트하기 위해, 대체 입력 파일에 결과 등을 기록 w으로 ,p만에 인쇄 입력 파일을 수정하지 않고, 그 결과를).

하나 이상의 전체 행앞에 추가 하려면 다음을 수행하십시오 .

와 같이, sed상기 i기능은 변함없이 텍스트에 후행 개행을 삽입 할 추가한다.

ed -s text.txt <<EOF
0 i
line 1
line 2
.
w
EOF
  • 0 i차종 0합니다 (파일의 시작) 모드 삽입 현재 라인이 시작 ( i); 줄 번호는 그렇지 않으면 1기반입니다.
  • 다음 줄은 현재 줄 앞에 삽입 할 텍스트 .이며 자체 줄 에서 끝납니다 .