와 같은 파일에 텍스트를 추가하고 싶습니다 echo "abc" >>file.txt
.
그러나 이것은 abc
새로운 줄을 추가 합니다.
abc
줄 바꿈없이 echo로 파일 끝에 어떻게 추가 할 수 있습니까?
abc
최종 개행없이 추가하는 방법이기 때문에 (당신의 질문을주의 깊게 읽은 후에) 원하는 것이 아닌 것처럼 보이기 때문에 이것을 말합니다 .
와 같은 파일에 텍스트를 추가하고 싶습니다 echo "abc" >>file.txt
.
그러나 이것은 abc
새로운 줄을 추가 합니다.
abc
줄 바꿈없이 echo로 파일 끝에 어떻게 추가 할 수 있습니까?
abc
최종 개행없이 추가하는 방법이기 때문에 (당신의 질문을주의 깊게 읽은 후에) 원하는 것이 아닌 것처럼 보이기 때문에 이것을 말합니다 .
답변:
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 기본 정의 장의 "정의"섹션에서 텍스트 파일 , 줄 및 줄 바꿈 문자 의 정의를 참조하십시오 .
0x41
(ASCII 'A'
)를 추가하면 더 이상 텍스트 파일이 아닌가? 그렇다면, 그 점이 직관적이지 않은 정의이기 때문에 그 점을 강조하는 것이 좋습니다. 그렇지 않은 경우, 약간의 문구 변경은 혼란을 피하는 데 도움이 될 수 있습니다.
나는 그것이 echo
명령으로 가능하다고 생각하지 않고 sed
대신 다음 접근법을 사용하십시오.
sed -i '$ s/$/abc/' file.txt
-i
- 파일 수정 올바른 위치를$
-마지막 레코드 / 라인을 나타냅니다s/$/abc/
-줄 끝을 $
하위 문자열로 대체하십시오 abc
(마지막 레코드의 경우)date >file; ls -i file; sed -i 's/201/ZZZ/' file; ls -i file
'$ s/$/$1/'
인쇄물 사용$1
파일이 개행으로 끝나지 않고 단순히 텍스트를 추가하지 않고 텍스트를 더 추가하려는 경우 다음 -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
여전히 사용자가 피하고자하는 것입니다 줄 바꿈, 선행 될 것이다.
\n
가 처음에는 나타나지 않도록 프로세스를 변경하려고한다는 가정을 사용하여 더 많이 대답했습니다 . 변경이 발생할 때마다 전체 파일을 다시 쓰지 않아도되는 경우 (특히 반복적으로 수행하면 다항식 시간으로 다소 느려질 수 있음) 더 많은 옵션이 더 좋습니다.
당신이 원하는 것은 마지막 줄의 끝에 그것을 추가하는 것입니다. 그래서 마지막 줄의 구분자 바로 앞에, 그래서 파일의 마지막 문자 바로 앞에 있습니다.
을 사용 ksh93
하면 다음을 수행 할 수 있습니다.
echo abc 1<> file >#((EOF - 1))
어디 1<>
(더 중요하고 읽기 + 쓰기 모드에서 파일을 열 수있는 표준 연산자 의 잘림없이 원본을 표준 출력에가)와 >#((...))
경우 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
아마도 UUOC 이지만 당신은 또한 할 수 있습니다 :
echo "$(cat file.txt)abc" >file.txt
Gilles가 지적한 것처럼이 명령은 제한되어 있습니다.
이것은 대부분 작동하지만 파일 끝에 빈 줄이 있고 바로 앞에 빈 줄이 있으면 그렇지 않습니다. 예를 들어, 마지막 줄이 처음에는 비어 있고 시간이 지남에 따라 확장되는 고정 된 수의 줄이있는 파일로, 때로는 마지막 줄이 비어있을 수 있습니다.
또한 cat
익숙하지 않은 파일을 사용 하는 것에주의하십시오 .
결론 :
sed 사용
echo
: P
cat
없지만 임의의 이스케이프 시퀀스가 터미널로 전송되는 문제와 관련이 있습니다.