텍스트 파일에 일부 문자열 데이터를 추가하는 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
솔루션은 의도는 하나 개 이상의 앞에 추가하는 경우 간단하게 할 수있는 전체 라인을 (입력 파일이 비어 있지 가정) 기존 내용 :
sed
의 i
함수는 전체 행을 삽입합니다.
와 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 유지) :
오래된 ed
POSIX 유틸리티 사용 :
노트 :
ed
항상 입력 파일 전체 를 메모리로 먼저 읽습니다 .
첫 번째 줄에 직접 추가 하려면 (와 마찬가지로 sed
입력 파일이 완전히 비어 있으면 ( 0
바이트) 작동하지 않음 ) :
ed -s text.txt <<EOF
1 s/^/to be prepended/
w
EOF
-s
ed
의 상태 메시지를 억제했습니다 .- 명령이
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
기반입니다.- 다음 줄은 현재 줄 앞에 삽입 할 텍스트
.
이며 자체 줄 에서 끝납니다 .