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.