예를 들어 파일에 텍스트를 추가하고 싶습니다 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>
덮어 쓰고 자신의 줄 바꿈을 추가한다는 점에 유의하십시오 .a
echo
동등한 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