2014-10-21 2 views
1

는 문자열 목록둔한 시스템 명령을 무시하고 백 슬래시

string1 
string2 
... 
abc\de 

파일을 고려하십시오.

문자열을 인쇄이 경우, 쉘 명령 을 실행 둔한의 시스템 명령을 사용하여

,

cat file | gawk '{system("echo " $0)}' 

마지막 문자열은 ABCDE하는 포맷됩니다. $ 0은 전체 레코드를 나타냅니다. 여기에 하나의 문자열이 있습니다.

gawk의 시스템 명령에는 제한이 있습니까? 포맷되지 않은 gawk 변수를 출력 할 수 없습니까?

답변

1

, 다음에, 그 관찰, 백 슬래시가 인쇄되지 않습니다 그러나

$ echo 'abc\de' | gawk '{system("echo " $0)}' 
abcde 

을 여기에, 백 슬래시가 인쇄됩니다

$ echo 'abc\de' | gawk '{system("echo \"" $0 "\"")}' 
abc\de 

차이가 있다는 것입니다 후자의 명령은 쉘 주위에 큰 따옴표를 사용하여 $0을 전달합니다. 큰 따옴표는 쉘이 백 슬래시를 처리하는 방법을 변경합니다.

정확한 동작은 한 셸에서 다른 셸로 변경됩니다. 모든 쉘 변덕을 피하면서

인쇄하려면 간단한 해결책은 다음과 같습니다

$ echo 'abc\de' | gawk '{print $0}' 
abc\de 
+0

원래 문제는 파일의 목록을 제거하려면 rm 명령을 사용하는 것이 었습니다. 따라서 gawk의 시스템 명령이 필요했습니다. –

+0

나는 실제로 gawk의 $ 0 변수가 Bash의 $ 0 변수와 다르다는 것을 알았으므로 $ 0 주위에 이중 백 슬래시로 솔루션을 고려하지 않았습니다. 이후 우리는 Bash의 $ 0 변수를 참조하게 될 것입니다. –

+0

@ MusséRedi 네, gawk의'$ 0'은 쉘의'$ 0'과는 다르며 관련이 없습니다. 'awk'는'echo "$ 0'을 보았을 때'echo'와 awk의'$ 0'의 내용을 연결합니다. 결과 문자열은 쉘로 전달됩니다. – John1024

0

Bash에서는 실제 백 슬래시를 나타 내기 위해 이중 백 슬래시를 사용합니다. 단일 백 슬래시의 기능은 문자을 이스케이프 처리하는 입니다. 따라서 시스템 명령은 전혀 형식을 지정하지 않습니다. 배쉬가있다.

이 문제에 대한 해결책은 awk에 백 슬래시를 미리 형식화하여 백 슬래시를 이중화하고 나중에 시스템 명령에 전달하는 기능을 작성하는 것입니다. Mussé 레디의 대답에 확장