줄 바꿈 없이 에코로 텍스트 추가

줄 바꿈 없이 에코로 텍스트 추가

예를 들어 파일에 텍스트를 추가하고 싶습니다 echo "abc" >>file.txt.

하지만 이것은 abc새 줄 뒤에 추가됩니다.

abc래핑하지 않고 파일 끝에 에코를 추가하는 방법은 무엇입니까 ?

답변1

파일이 아직 개행 문자로 끝나지 않고 텍스트를 추가하지 않고 일부 텍스트만 추가하려는 경우 이 -n매개변수를 사용할 수 있습니다.

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

그러나 일부 UNIX 시스템에서는 이 옵션을 제공하지 않습니다 printf.

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

(원래 인수는 서식 지정 문자가 %s추가된 텍스트 %에 포함되지 않도록 방지하는 것이었습니다)

(macOS High Sierra 에서 man echo):

-N

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

답변2

echo "abc" >>file.txt개행뒤쪽에 abc, 이전에는 아닙니다. abc자신 만의 줄을 사용하게 된다면 이전 개행 문자가 abc이미 존재한다는 의미입니다 file.txt.

텍스트 파일이 개행 문자로 끝나는 것은 완전히 정상적인 현상입니다. Unix에서 줄은 null⁰ 또는 개행 문자 이외의 문자 시퀀스와 그 뒤에 오는 개행 문자로 구성됩니다. 1 따라서 비어 있지 않은 모든 텍스트 파일은 개행 문자로 끝납니다.

파일의 마지막 줄에 텍스트를 추가하려면 다음을 >>사용 하여 수행할 수 없습니다. 대신 기존 파일을 수정할 수 있는 도구가 필요합니다. 예를 들어 다음을 사용할 수 있습니다.sed:

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

sed 명령에서 first $는 "마지막 줄에서만 다음 명령을 실행한다"는 의미로 s/REGEX/REPLACEMENT/REGEX를 REPLACMENT로 바꾸고 정규식은 $줄의 끝과 일치합니다.

Linux의 sed 명령에는 새 파일 생성 및 교체 순서를 자동화하는 기능이 내장되어 있으므로 다음과 같이 단축할 수 있습니다.

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

⁰이것은 ASCII에서는 NUL, 유니코드에서는 U+0000이라고 하는 널 바이트입니다. 텍스트 처리 프로그램은 이 문자를 처리할 수도 있고 처리하지 않을 수도 있습니다.
1 정의 보기텍스트 파일,철사, 그리고개행 문자"정의" 섹션에서기본 정의IEEE 1003.1-2008:2016 장.

답변3

echo명령어로는 안되는 것 같은데 , 아래 명령어를 이용해주세요sed반대 접근 방식:

sed -i '$ s/$/abc/' file.txt
  • -i- 파일 수정제자리에
  • $- 마지막 레코드/라인을 나타냅니다.
  • s/$/abc/$- 줄 끝을 하위 문자열로 교체 abc(마지막 레코드의 경우)

답변4

원하는 것은 파일의 마지막 문자 앞인 마지막 줄 구분 기호 앞, 마지막 줄 끝 부분에 추가하는 것입니다.

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

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

1<>읽기+쓰기 모드에서 파일을 여는 표준 연산자는 어디에 있습니까(더 중요한 것은)잘림 없음) stdout에 있으며 >#((...))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

관련 정보