2013-11-01 3 views
4

이 문제에 대한 해결책이 있는지 알고 싶습니다. 내 쉘 스크립트에서텍스트를 리디렉션 할 때 들여 쓰기 코드

나는 파일에 텍스트를 리디렉션하는 몇 가지 코드를 가지고 :

if [ condition ]; then 
    cat > /outputfile <<EOF 
text123 
text345 
text456 
EOF 
fi 

문제는 내가 다음 리디렉션 된 텍스트는 공백이 것이 작업을 수행하지만, 내 코드에서 textxxx 들여 쓰기를 원하는 것입니다 그 안에.

코드를 들여 씁니다. 공백없이 출력 파일을 만들 수있는 방법이 있습니까?

답변

2
표준 대답은 (그들이 공 i이 아닌 탭해야합니다) 선도 탭을 사용하는 것입니다

하고 '단어'전에 - :

cat <<-'EOF' 
     Tab-indented text 
    Blank-indented text 
EOF 

어떤 (당신이 경우 '탭 들여 쓰기'이전에 하나 이상의 실제 탭이 있음) :

Tab-indented text 
    Blank-indented text 

만약 그렇다면 불편하고 하나 개의 대안은 cat 대신 sed을 사용하는 것입니다

sed 's/^[  ]*//' <<EOF 
    Randomly 
     Indented 
    Text 
EOF 

하는 출력 :

Randomly 
Indented 
Text 

(다시 말하지만, 당신이 바로 그 장소에서 탭이 있는지 확인해야; 여기, sed 명령의 정규식을 의미합니다. 또는 원하는 경우 sed 's/^[[:space:]]*//'을 사용할 수 있습니다.

'EOF'EOF의 사용은 here 문서의 본문이 해석되는 방식 (또는 해석되지 않음)에 영향을줍니다. 비교 :

cat <<-EOF 
     $(rm -fr *) # Do not try this at home! (Or at work.) 
     $HOME 
EOF 

cat <<-'EOF' 
     $(rm -fr *) 
     $HOME 
EOF 

쉘이 $(...) 표기법을 인식하고 명령을 실행하고 여기에 문서로 출력 (아무것도)를 대체해야합니다 첫 번째

. 지난 1 년 또는 2 년 동안해온 작업에 대해 사과드립니다! 희망찬 백업이 있기를 바랍니다. 두 번째는 대본의 내용을 선두 탭을 제거하는 것과 별도로 취급합니다. $(rm -fr *)과 같은 표기법은 안전하지는 않지만 더 안전합니다. 변수 $HOME은 첫 번째 버전에서 확장됩니다. 그것은 두 번째로 변함없이 남아있을 것입니다.

+0

누락 비트 : EOF를 인용하면 여기에있는 문서 본문이 효과적으로 인용됩니다. 원래의 질문은 인용되지 않았다. – user2719058

+0

@ user2719058 : true; 나는 그 감독을 고쳤다. –

5

사용

cat<<-EOF 
    text123 
EOF 
+3

'선행 공백'은 탭이어야합니다. –

+0

그래, 고마워, 고마워. – user2719058

+0

고마워, 내가 EOF 사이에있는 텍스트의 일부 줄이 너무 길어서 줄 바꿈을 넣을 수 있지만 그 사이에 탭이 추가되었습니다. 그걸 피할 ​​수있는 방법이 있습니까? 예를 들어, text123 뒤에 \를 추가하고 그 아래에 한 줄을 추가하면 text456이 표시됩니다. 한 줄에 있지만 그 사이에는 탭이 있습니다. – user117974

관련 문제