쉘의 매개변수에서 < 또는 >를 이스케이프 처리하는 방법은 무엇입니까?

쉘의 매개변수에서 < 또는 >를 이스케이프 처리하는 방법은 무엇입니까?

grep해당 문자가 포함된 PCRE 표현식과 함께 사용하고 싶습니다 <. Bash는 내가 리디렉션을 원한다고 생각하지만 그렇지 않습니다. 어떻게 탈출하나요 <?

답변1

백슬래시를 사용하여 이 작업을 수행할 수 있습니다.

25 % grep \< xmospos.c
#include        <stdio.h>
#include        <stdlib.h>
#include        <getopt.h>
#include        <X11/Xlib.h>

인용된 '미만' 기호와 인용된 백슬래시 '미만' 기호는 모두 어리석은 대답을 제공합니다.

답변2

두 가지 간단한 규칙:

  • 백슬래시는 \C개행 문자를 제외하고 다음 문자를 이스케이프합니다.
  • 작은따옴표는 'text'백슬래시를 포함하여 그 사이의 모든 문자를 이스케이프하지만 작은따옴표는 이스케이프되지 않습니다(인용된 텍스트의 끝을 표시하기 때문).

그러므로:

grep -P '<html>' myfile
grep -P \<html\> myfile
grep -P '(?<!<)html' myfile
grep -P \(\?\<\!\<\) myfile

'\''작은따옴표가 포함된 매개변수를 전달해야 하는 경우 작은따옴표 내의 작은따옴표를 "이스케이프"하는 방법을 사용할 수 있습니다 . 기술적으로 이것이 하는 일은 첫 번째 리터럴 텍스트를 끝내고 리터럴을 '같은 단어에 넣은 다음 더 많은 리터럴 텍스트를 같은 단어에 넣는 것입니다.

grep '^D'\''oh!' myfile

나머지 인용 규칙(요약):

  • !"#$&'()*;<>?[\]^`{|}~공백 및 문자 (즉, 문자, 숫자 %+,-./:=@_및 ASCII가 아닌 문자) 는 최소한 어느 정도 인용해야 합니다.
  • 큰따옴표 사이에 및 를 제외한 모든 문자는 문자 그대로 사용됩니다 "$\`(기록 가능 쉘에서) !. 리터럴이 아닌 문자 중 하나 앞에 오지 않으면 큰따옴표 사이의 백슬래시가 문자열에 나타납니다.

이러한 규칙은 bash 및 기타 Bourne 스타일 셸(예: ash 및 ksh)에 적용됩니다. 또한 zsh에서도 작동합니다( =공백 뒤에 따옴표가 올 수 있다는 점 제외). csh/tcsh와 Fish에서는 규칙이 다릅니다.

관련 정보