echo 명령과 리디렉션 연산자를 사용하여 줄 바꿈 특수 문자를 파일에 넣는 방법은 무엇입니까?


29

echo 명령과 리디렉션 연산자를 사용하여 파일을 만들려면 파일을 몇 줄로 만들어야합니다.

문자열 안에 "\ n"으로 줄 바꿈을 포함하려고했습니다.

echo "first line\nsecond line\nthirdline\n" > foo

그러나이 방법으로 세 줄의 파일은 만들지 않지만 한 줄과 문자열의 내용 만있는 파일이 만들어집니다.

이 명령 만 사용하여 여러 줄의 파일을 어떻게 만들 수 있습니까?


답변:


30

다음 echo명령으로 몇 가지 구문을 사용하도록 요청했습니다 .

echo $'first line\nsecond line\nthirdline' > foo

(그러나 당신이 얻은 다른 대답도 고려하십시오.)

이 $'...'구문은 임베디드 ANSI 이스케이프 시퀀스를 확장합니다.


1
이것은 POSIX가 아니며 사용 가능한 쉘에 따라 크게 달라집니다.
— 크리스 아래

1
눈에 띄는 쉘 (적어도), ksh, bash, zsh (및 기타)에서 해당 구문을 찾을 수 있습니다.
— Janis

1
@ChrisDown, POSIX는 아니지만 이슈 8에 포함될 예정입니다. ksh93, bash, zsh, mksh, FreeBSD sh가 지원합니다.
— Stéphane Chazelas

24

echo가 문자 이스케이프와 관련이있는 것은 구현 정의입니다. 대부분의 현대 에코를 포함하여 많은 에코 구현에서 전달 된 문자열은 기본적으로 이스케이프를 검사하지 않습니다.

GNU bash에서 제공하는 에코 (내장) 및 다른 에코 변형을 사용하면 다음과 같은 작업을 수행 할 수 있습니다.

echo -en 'first line\nsecond line\nthird line\n' > file

그러나 실제로 printf는 원하는 것처럼 들리므로 내 눈에 더 잘 보이고 휴대하기도 쉽습니다 (POSIX에서 정의한이 기능이 있음).

printf '%s\n' 'first line' 'second line' 'third line' > file

here 문서 사용을 고려할 수도 있습니다 .

cat > file << 'EOF'
first line
second line
third line
EOF

내가 Enter 키를 누르십시오 때,가, 내가,>이있어 각 라인 프롬프트 모양의 쉘에 당신의 고양이> 파일 << 'EOF'을 시도했지만 난 + X 또는 Ctrl + Z를 Ctrl 키를 쳐서 그것을 밖으로 가져올 수 없습니다
— 압둘 알 Hazred

하나의 입력 라인에 EOF 만 입력해야합니다.
— Rmano

2
@mikeserv 면심하거나 진지합니까?
— Matthew 읽기

1
답변의 링크가 나타내는 것처럼 @AbdulAlHazred는 "여기 문서"라고하며 매우 일반적입니다. 위키피디아는이 주제에 대해 잘 알고 있습니다 : en.wikipedia.org/wiki/Here_document
— dave_thompson_085

1
이것은 특히 내 맥 OSX (근무 echo -en 'text..'허용 대답은 내 개행 문자 (인식하지 않은 반면, \n)의는 echo -en않았다.
— benjaminmgross

4

echo명령을 사용하여 여러 줄 파일을 만드는 다른 방법은 다음과 같습니다 .

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo

여기서 두 번째 및 세 번째 명령은 경로 >>재 지정 연산자를 사용하여 명령 의 출력이 파일에 추가 (추가)됩니다 (이 시점까지 이미 존재해야 함).

또는

(echo "first line"; echo "second line"; echo "third line") > foo

여기서 괄호는 echo명령을 하나의 하위 프로세스로 그룹화합니다. 이 프로세스는 여러 줄을 출력하는 단일 프로그램처럼 보입니다 ( ls예 : 등).

위의 미묘한 변형은

{ echo "first line"; echo "second line"; echo "third line";} > foo

이것은 하위 프로세스를 만들지 않는다는 점에서 두 번째 답변보다 약간 더 효율적입니다. 그러나 구문이 약간 까다로워집니다. {및 뒤에 세미콜론 뒤에 공백이 있어야 합니다 }.

셸의 제어 및 리디렉션 연산자 란 무엇입니까?를 참조하십시오 . 자세한 내용은.


2

또 다른 옵션을 제공하려면 다음을 누르십시오 Enter (예 : 리터럴 개행).

$ echo "the rain in spain
> falls mainly on the plain" > foo

>두 번째 줄의 시작 부분에를 입력하지 마십시오 . $PS2불완전한 명령을 입력하면 (예 : 일치하지 않는 인용 부호가있는 명령) 쉘이 인쇄 하는 보조 쉘 프롬프트 입니다.


0

POSIX 7은 할 수 없다고 말합니다

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e 정의되지 않고 백 슬래시는 구현 정의입니다.

첫 번째 피연산자가 -n이거나 피연산자 중 하나에 <backslash> 문자가 포함 된 경우 결과는 구현 정의됩니다.

선택적 XSI 확장이없는 한.

따라서 printf대신 사용하십시오.

형식 피연산자는 XBD 파일 형식 표기법 [...]에 설명 된 형식 문자열로 사용됩니다.

파일 형식 표기 :

\ n <newline> 인쇄 위치를 다음 줄의 시작 부분으로 이동하십시오.

또한 Ubuntu 15.10과 대부분의 배포판 echo은 다음과 같이 구현 됩니다.

  • 배쉬 내장 : help echo
  • 독립형 실행 파일 : which echo

혼동을 일으킬 수 있습니다.


이있을 것입니다 echo시스템에서 사용할 수있는 모든 쉘에 내장. 우분투에서 / bin / sh는 일반적으로 대시이며 bash는 기본적으로 제공됩니다. zsh, rc, mksh, yash, csh, tcsh, ksh93 ...은 모두 서로 다른 동작을 가진 자체 반향을 갖습니다. 주 which echo당신에게 시스템의 경로를 제공하지 않습니다 모든 쉘에 에코.
— Stéphane Chazelas

@ StéphaneChazelas "에코는 모든 쉘에서 시스템 에코의 경로를 제공하지 않습니다." 내가 알지 못했던 것 외에는 무엇을 줄 수 있습니까?
— Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

tcsh 또는 zsh에서 시도하십시오. which원래 (80 년대) csh 사용자를위한 csh 스크립트 (~ / .cshrc에서 별명을로드 함) 였지만 여전히 일부 시스템에 있습니다. whichzsh 및 tcsh에 내장되어 있습니다.
— Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.