2011-03-22 7 views
13

나는 더 사용할 수있는 변수에 그렙 결과를 할당 할 :grep 결과를 줄 바꿈으로 보존하는 방법은 무엇입니까?

lines=`cat abc.txt | grep "hello"` 

하지만 내가 발견 한 것은 $ 선이 더 이상 개행 문자를 포함하지 않는 것입니다. 그래서 내가 할 때

echo $lines 

단 한 줄만 인쇄됩니다. 줄 바꿈 문자를 보존하려면 어떻게해야합니까? $ 줄을 표시 할 때 고양이와 똑같습니다. abc.txt | grep "hello". ,

echo $lines 의미

는 " lines라는 변수의 내용으로 $lines를 대체하여 새 명령을 양식 :

+5

고양이 학대 :'라인 = $ (그렙 안녕하세요 abc.txt)' . –

+0

또한보십시오 http://stackoverflow.com/questions/613572/capturing-multiple-line-output-to-a-bash-variable/ –

답변

32

당신은 정교한

echo "$lines" 

대신

echo $lines 

의하고 싶은 말 공백 문자로 분할하여 echo 명령에 대한 새로운 인수를 0 개 이상 만들지 않습니다. PLE : 쉘 변수 lines에 저장된 개개의 단어 사이의 공백의 특정 종류를 무시되므로

lines='1 2 3' 
echo $lines # equivalent to "echo 1 2 3" 
lines='1 2 3' 
echo $lines # also equivalent to "echo 1 2 3" 
lines="1 
2 
3" 
echo $lines # also equivalent to "echo 1 2 3" 

이러한 모든 예는 동등하다. 사실, 쉘은 변수의 내용을 특별한 IFS (내부 필드 구분 기호) 변수의 문자로 분할합니다.이 변수는 기본적으로 (적어도 내 버전의 bash에서는) 3 문자의 공백, 탭 및 개행 문자로 설정됩니다 .

다른 한편으로는 변수 lines의 정확한 값에서 단일 인수를 새로 만드는 것을 의미합니다.

자세한 내용은 bash 매뉴얼 페이지의 "확장"및 "단어 분할"절을 참조하십시오.

+1

고마워, 그것은 작동한다. 차이점을 설명해 주시겠습니까? – Dagang

+3

+1 매우 도움이되는 정교함. – harpo

0

grep 용 Windows 포트를 사용하십시오. (원래 질문이 아니기 때문에 * nix에는 적용되지 않습니다.) 그 -U 문제를 멋지게 해결 찾았습니다. --help에서

:

-U는, --binary는 EOL에서 CR 문자를 제거하지 않습니다 (MS-DOS)

+0

그것은 작동합니다. @Haggisbreath에게 감사합니다. -U 로그를 사용하여 새 줄을 인쇄합니다. grep 명령은 ... 전자 app.js | grep -line-buffered -i -e "오류"-U | 티 logs.txt – Gaurav

관련 문제