줄 바꿈없이 에코를 사용하여 텍스트 추가


15

와 같은 파일에 텍스트를 추가하고 싶습니다 echo "abc" >>file.txt.

그러나 이것은 abc새로운 줄을 추가 합니다.

abc줄 바꿈없이 echo로 파일 끝에 어떻게 추가 할 수 있습니까?


2
파일에 이미 줄 바꿈이 있으며 그 뒤에 추가하는 것입니다. 따라서 마지막 줄의 줄 바꿈 문자를 "abc"로 바꿔야합니다.
ctrl-alt-delor

StackExchange에 오신 것을 환영합니다! 당신의 질문은 좋습니다. 파일 내용의 예 (추가 전, 추가 후 얻는 것, 대신 원하는 것)를 지정하면 더 좋을 것입니다. 나는 대답 중 하나가 abc최종 개행없이 추가하는 방법이기 때문에 (당신의 질문을주의 깊게 읽은 후에) 원하는 것이 아닌 것처럼 보이기 때문에 이것을 말합니다 .
법 29

답변:


19

echo "abc" >>file.txt이전이 아니라 이후 에 개행 문자를 넣습니다 abc. abc자체 행으로 끝나는 경우 이전의 개행 문자 abc가 이미에 있음 을 의미합니다 file.txt.

텍스트 파일이 줄 바꿈으로 끝나는 것은 정상입니다. 유닉스에서, 줄은 null⁰이나 줄 바꿈 이외의 문자 순서와 줄 바꿈으로 구성됩니다. 1 따라서 비어 있지 않은 텍스트 파일은 개행 문자로 끝납니다.

파일의 마지막 줄에 텍스트를 >>추가하려면 항상 파일에 추가하므로 항상 마지막 줄 바꿈 뒤에 씁니다. 대신 기존 파일을 수정할 수있는 도구가 필요합니다. 예를 들어, sed 를 사용할 수 있습니다 :

sed '$ s/$/abc/' file.txt >file.txt.new && mv file.txt.new file.txt

sed 명령에서 첫 번째 명령 $은 "마지막 행에서만 다음 명령 만 수행"을 의미하며 명령 s/REGEX/REPLACEMENT/은 REGEX를 REPLACEMENT로 대체하며 정규식 $은 행 끝에서 일치합니다.

Linux의 sed 명령에는이 새로운 파일 생성 및 교체 시퀀스를 자동화하는 기본 제공 기능이 있으므로이를 단축 할 수 있습니다.

sed -i '$ s/$/abc/' file.txt

즉 ASCII가 NUL를 호출하고 유니 코드 + 0000 U를 호출하는 널 바이트입니다. 텍스트 처리 프로그램은이 문자를 처리하거나 처리하지 않을 수 있습니다.
1 IEEE 1003.1-2008 : 2016 기본 정의 장의 "정의"섹션에서 텍스트 파일 , 줄 바꿈 문자 의 정의를 참조하십시오 .


2
두 번째 단락은 줄 바꿈으로 끝나지 않는 파일이 텍스트 파일이 아니라는 것을 의미합니까? 예를 들어 줄 바꾸기로 끝나는 기존 ASCII 텍스트 파일을 가져 와서 단일 바이트 0x41(ASCII 'A')를 추가하면 더 이상 텍스트 파일이 아닌가? 그렇다면, 그 점이 직관적이지 않은 정의이기 때문에 그 점을 강조하는 것이 좋습니다. 그렇지 않은 경우, 약간의 문구 변경은 혼란을 피하는 데 도움이 될 수 있습니다.
David Z

2
@DavidZ : Unixland에서 텍스트 파일의 표준 정의입니다. IIRC 그것은 POSIX 어딘가에 있습니다.
Kevin

1
@ 케빈 흥미 롭습니다. 전에는 들어 본 적이 없습니다. 글쎄, 그것이 표준이더라도, 나는 그것이 직관적이지 않다고 생각합니다.
David Z

15

나는 그것이 echo명령으로 가능하다고 생각하지 않고 sed대신 다음 접근법을 사용하십시오.

sed -i '$ s/$/abc/' file.txt
  • -i- 파일 수정 올바른 위치를
  • $ -마지막 레코드 / 라인을 나타냅니다
  • s/$/abc/-줄 끝을 $하위 문자열로 대체하십시오 abc(마지막 레코드의 경우)

2
"제자리"가 실제로 제자리를 의미하지는 않습니다. "편집 된 컨텐츠를 기존 파일과 함께 이름이 지정된 임시 파일에 기록한 다음 바꾸십시오"를 의미합니다. 다음과 같이 inode를 살펴보면이를 증명할 수 있습니다.date >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
roaima

@roaima, sed가 inode 번호를 변경하는 것에 대해 알고 있습니다.
RomanPerekhrest

2
나는 당신이되었을 것이라고 생각하지만, 나는 당신의 중점을두고 있다고 우려했다 인플레 이스 영업 밤이 큰 파일을 예를 들어 더블 디스크 공간 사용을 방지하기 위해 사용될 수있다 생각합니다.
roaima

@roaima, night think- > think think ...
RomanPerekhrest

abc를 변수로 바꾸려면 어떻게해야합니까? '$ s/$/$1/'인쇄물 사용$1
Florian Castelain

13

파일이 개행으로 끝나지 않고 단순히 텍스트를 추가하지 않고 텍스트를 더 추가하려는 경우 다음 -n과 같은 인수를 사용할 수 있습니다.

echo -n "some text here" >> file.txt

그러나 일부 UNIX 시스템은이 옵션을 제공하지 않습니다. 이 경우 사용할 수 있습니다 printf. 예 :

printf %s "some text here" >> file.txt

(초기 %s인수는 %서식 문자가 포함 된 추가 텍스트로부터 보호 해야 함)

에서 man echo(맥 OS 높은 시에라에) :

-엔

후행 줄 바꿈 문자를 인쇄하지 마십시오. 이것은 '\c'iBCS2 호환 시스템에서와 같이 문자열 끝에 추가 하여 수행 할 수도 있습니다 . 이 옵션과 그 효과는 '\c'Cor에 의해 수정 된 IEEE Std 1003.1-2001 ( "POSIX.1")에 구현 정의되어 있습니다. 1-2002. 최대 이식성을 목표로하는 응용 프로그램 printf(1)은 줄 바꿈 문자를 억제하는 데 사용하는 것이 좋습니다 .


그것은 매우 분명 않습니다 개행 문자로 끝납니다. echo -n말에 더 개행을 넣어하지 않을 것이다 abc, 그러나 abc여전히 사용자가 피하고자하는 것입니다 줄 바꿈, 선행 될 것이다.
Kusalananda

@Kusalananda 내 대답은 OP가 스퓨리어스 \n가 처음에는 나타나지 않도록 프로세스를 변경하려고한다는 가정을 사용하여 더 많이 대답했습니다 . 변경이 발생할 때마다 전체 파일을 다시 쓰지 않아도되는 경우 (특히 반복적으로 수행하면 다항식 시간으로 다소 느려질 수 있음) 더 많은 옵션이 더 좋습니다.
솜털

9

truncate명령이 있고 텍스트 파일에 마지막 문자로 NL 이 있으면 명령을 제거하고 다음과 같이 텍스트를 추가 할 수 있습니다.

truncate --size -1 file.txt
echo "abc" >>file.txt

( truncate파일 내용에 대해서는 신경 쓰지 않으며이 예제에서는 단순히 파일 크기를 1 바이트 씩 줄입니다. 마지막 문자가 단일 바이트가 아닌 경우, 즉 다중 바이트 "와이드"문자 인 경우 손상이 발생합니다.)


5

당신이 원하는 것은 마지막 줄의 끝에 그것을 추가하는 것입니다. 그래서 마지막 줄의 구분자 바로 앞에, 그래서 파일의 마지막 문자 바로 앞에 있습니다.

을 사용 ksh93하면 다음을 수행 할 수 있습니다.

echo abc 1<> file >#((EOF - 1))

어디 1<>(더 중요하고 읽기 + 쓰기 모드에서 파일을 열 수있는 표준 연산자 의 잘림없이 원본을 표준 출력에가)와 >#((...))경우 ksh93 - 특정 추구 연산자 (여기에 마지막 바이트 이전에 추구하기 위해). 새 줄을 덮어 echo쓰는 abc<newline>위치 를 쓰고 자체 줄 바꿈을 추가합니다.aecho

zsh해당 :

zmodload zsh/system
{sysseek -w end -u 1 -1 && echo abc} 1<> file

보다 정확한 결과를 얻으려면 찾지 못한 경우 오류 메시지를 인쇄해야합니다.

zmodload zsh/system
if sysseek -w end -u 1 -1; then
  echo abc
else
  syserror -p "$0: $LINENO: seek: "
fi 1<> file

-1

아마도 UUOC 이지만 당신은 또한 할 수 있습니다 :

echo "$(cat file.txt)abc" >file.txt

Gilles가 지적한 것처럼이 명령은 제한되어 있습니다.

이것은 대부분 작동하지만 파일 끝에 빈 줄이 있고 바로 앞에 빈 줄이 있으면 그렇지 않습니다. 예를 들어, 마지막 줄이 처음에는 비어 있고 시간이 지남에 따라 확장되는 고정 된 수의 줄이있는 파일로, 때로는 마지막 줄이 비어있을 수 있습니다.

또한 cat익숙하지 않은 파일을 사용 하는 것에주의하십시오 .

결론 :

sed 사용


2
이것은 대부분 작동하지만 파일 끝에 빈 줄이 있고 바로 앞에 빈 줄이 있으면 그렇지 않습니다. 예를 들어, 마지막 줄이 처음에는 비어 있고 시간이 지남에 따라 확장되는 고정 된 수의 줄이있는 파일로, 때로는 마지막 줄이 비어있을 수 있습니다.
Gilles 'SO- 악마 그만해

삭제해야합니까? 나는 확실히 로마는 / 당신의 대답은 갈 수있는 적절한 방법이라고 생각하지만 대안을 보는 것처럼 개인적으로 알고, 영업 이익은 요청 않았다 echo: P
jesse_b

1
또한 이것은 전체 파일을 명령 행에 넣습니다
n.caillou

@ n.caillou 응? STDOUT에는 아무것도 인쇄되지 않습니다.
jesse_b

2
글쎄, 이러한 취약점 중 어느 것도 실제로 관련이 cat없지만 임의의 이스케이프 시퀀스가 ​​터미널로 전송되는 문제와 관련이 있습니다.
ilkkachu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.