[^] 무엇에와 [!] 차이? - 쉘 (13) Q는 <열네 번째 질문>

[^] 무엇에와 [!] 차이? - 쉘 (13) Q는 <열네 번째 질문>

퉁명스럽게 그것을 넣어이 질문은, 차이 와일드 카드 (와일드 카드)와 정규 표현식 (정규식)을 탐구하는 것입니다. 이것은 왜 많은 초보자 쉘 친구들 쉽게 혼란스러운 장소입니다.

우선,의 다시 두 번째 Q 13 Q 가자, 명령 줄 형식은 다시 한 번 우리가 한 번 언급 검토 할 것입니다 :

[code]command_name options arguments[/code]

동시에, 나는 또한 언급 한 변수 Q (5)의 교체 방법 특성을 이해하게 :

[code]先替换, 再重组 command lline![/code]

지금 무슨 일이 일어나고 있는지 우리가 살펴 와일드 카드 (와일드 카드)를 수행 한 후에 만이 두 채널을 기준으로.

파트 I : 와일드 카드 (와일드 카드)

먼저, 와일드 처리 공정은 상기 인수로 행동 명령 라인의 일부이다.

네, 옵션에서 command_name을에하지 않을 것이다. 또한, 인수가 경로가 아닌 경우, 다음은 와일드 카드와는 아무 상관이있다. 용어의 다른 단어보다 정확한 정의, 와일드 카드는 명령 줄 확장 (경로 확장)의 경로입니다 기능.

다음 "구조 조정"명령 줄의 특성 잊지 마세요,이 확장을 언급!

네,이 구조 조정 속성은 같은! 와일드 카드 후 연장되어있는 변수 (변수 치환) 및 명령 대체 (명령 치환)로 대체있어, 명령 줄은 재구성 처리됩니다 껍질 완료됩니다.

了解了 wildcard 的扩展与重组特性后, 接下来, 让我们了解一些常见的 wildcard 吧:

*     : 匹配 0 或多个字符
?     : 匹配任意单一字符
[list]: 匹配 list 中的任意单一字符(注一)
[!list]              : 匹配不在 list 中的任意单一字符
{string1,string2,...}: 匹配 sring1 或 string2 (或更多)其一字符串
(注一: list 可以为指定的个别字符, 如 abcd; 也可以为一段 ASCII 字符的起止范围, 如:
a-d .)

例:
a*b: a 与 b 之间可以有任意长度的任意字符, 也可以一个也没有, 如: aabcb, axyzb, a012b,
ab 等.
a?b: a 与 b 之间必须也只能有一个字符, 可以是任意字符, 如: aab, abb, acb, a0b 等.
a[xyz]b: a 与 b 之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb 这
三个.
a[!0-9]b: a 与 b 之间必须也只能有一个字符, 但不能是阿拉伯数字, 如: axb, aab, a-b 等.
a{abc,xyz,123}b: a 与 b 之间只能是 abc 或 xyz 或 123 这三个字符串之一, 如 aabcb,
axyzb, a123b 这三个.

참고 :
[!]! 1) 첫 번째 선택에는, 전원의 유일한 예를 제외 할 .. [! A] * 현재의 디렉토리의 경로 이름 열려면 먼저 모든 나타내지 않는 /tmp/[a\!]*표현 / tmp에 이름이나 경로!의 시작과 디렉토리 (생각!? 왜 전면 팁을 추가 할 : 4의 13 Q를)

2) [-] - 문자 때, 또는 단지 일부에 대한 범위를 나타내는 좌우 양측, "-":. (마이너스) 문자 처리 예 / 개의 Tmp / [-Z] / [A-ZA- Z] 편지 (대소 문자 구분) 이름 시작으로 끝나는 하위 디렉토리 경로 - / 모든 Z 또는 TMP 카탈로그를 나타낸다.

? 3) 인 파일을 (숨길 수 없습니다 첫번째 파일을 열도록 * 와일드 카드 일치의 시작) 예 .. * .txt 인이 .txt하지만 일치하지 않을 수 있습니다이 경기 1.TXT 경로 이름.

? 잊지 마세요 : 그러나 1 * TXT 및 와일드 카드 마스터, 기본적으로이 경로 이름을 일치시킬 수 1 TXT의 1.TXT는 한 다음 하드 생각하는 연습을 더하고, 당신이 요리 사용할 수 있습니다로, 다시 알림을 추가, 어려운 일이 아니다 이 중요한 기능을하고, 경로 만 인수에 작용하는 "구조 조정 확대 +는". 예를 들어, a.txt이 b.txt c.txt 1.TXT 2.txt 3.txt 현재 디렉토리에이 문서가 있다고 가정. 우리는 명령 줄 (LS)에서 명령 라인을 발행 할 때 -l [0-9]가 .txt 때문에 그 후, 확장 된 1.TXT 2.txt 3.txt에 일치하도록 통로에 위치 와일드 인수 은 ls -l 1.TXT 2.txt 3.txt 같은 명령 줄의 개편.

그래서, 당신은 명령 줄에 노크 ls -l [0-9].txt 与 ls -l 1.txt 2.txt 3.txt동일한 결과가 정확하게 이것 때문에입니다 ... :)

파트 II : 정규 표현식

다음 정규 표현식 (RE)의 큰 주제, 많은 이야기, 나는 물론 여기에 말할 수없는 것은 매우 완료됩니다. 우리는 기본적인 입문 개념을 가지고 싶어, 그것은 충분하다.

영어 시험보기 좋은 먼저?. 표현은 단순히 무엇을, 통신의 사람들이 언급 될 것입니다 "표현"입니다, 그러나, 생활, 표현 측 그래서 그 설명의 명확성의 의미를 지우려면받는 사람 완전하고 정확한 이해하지 쉬운 일. 따라서 정말 비통 한 문장 "어려운 표현"은 "오해"의 많이 나타납니다 아 ....

방법은 우리가 오해 최소화 할 수 있습니다 무엇과 표현을 보자 같은 상황은 우리가 그렇게 할 때, 특히, 우리는 "텍스트"시간에 대한 설명 기술에 요청해야합니다, 데이터 처리 컴퓨터에서 발생 정확성 그것의 가장 높은 정도는?
대답은 "표준화", 또한 우리가 얘기하고 여기에 있다는 .. 정규 표현식

그러나, RE 소개에 들어가기 전에, 우리가 인용 약의 일부 네 번째를 요청하는 안티 쉘 (13)가 아닌 것을 살펴 보자.
열쇠는 구별 할 수있을 것입니다 에 메타와 문자 쉘 명령 행 이 두 개의 서로 다른 문자 카테고리.

: 다음, 나는 당신에게 여기에 있었다
캐릭터의 RE 표현은 문자와 메타에 모두입니다!

오, 친애하는 독자 나는 그것의 혼란을 여부를 모른다?
이 정말 여기 시간 RE 친구를 많이 다이 학습, 가장 쉬운 혼란 장소이기 때문에 그것은 당연 당신입니다! 오 이해에 특히주의해야합니다 .. .
당신이 사용하는 스크립트 RE 특정 프로그램을 작성하지 않는 한 짧은에, 그렇지 않으면, 우리의 RE는 커맨드 라인을 통해 입력됩니다. 그러나, 쉘 메타 문자와 메타 문자로 시작하는 RE, 많은 충돌하는 .

예를 들어, RE에 * 문자는 명령 라인에서 개질제 (후술)를, 거기이지만 와일드있다!

그래서, 우리가 어떻게 같은 충돌에게 그것을 해결하는 방법은 무엇입니까? 키는 열세 4 이해할 수있을만큼의 말을 인용 언급할지 묻는 메시지에 대해 물어 보는 것입니다!
당신이 쉘 메타 명령 줄이 기본 원칙을 닫는 것입니다 인용하는 쉘을 이해한다면, : 당신은 쉽게의 충돌 RE 메타와 쉘 메타 해결 할 수있을 것입니다
쉘 인용 쉘 메타 오프 전환하고자하는 사용!

그것은 와일드 카드 확장과 개편으로 확장하는 것 등의 abc * 같은 경우 명령 줄에서 더 인용 프로세스가 존재하지 않는 경우는 그 다음에 그냥 예를 들어, * 문자를 언급.이 같은 'ABC로, 인용에 배치되어있는 경우 * "와일드 카드 확장 과정을 피할 수 있습니다.

음, 하루의 대부분, 공식 RE를 입력하지 않은 것을 ... 그것을 소개
나의 가르침 스타일은 첫 번째 단계.에 의한 기초 단계 구축하는 것입니다 때문에 나는 걱정하지
그래서를, 그럴 게요하는 거절의 개념에 여기뿐만 아니라 해요 RE 친구를 설명하기 위해 ... (하 ... ... 저를 때리지 마세요)
우리가 RE에 대해 이야기 할 때, 와일드 카드 함께 혼동 말하지 마!

특히 여기서 명령 줄 위치에, 경로 만 인수에 따라 행동 와일드 카드하지만, RE에서 만 경로 이름과는 아무 상관 없다 "문자열 처리"프로그램을 위해! 문자열은 보통 RE에서 처리하지 않았다 이 문서에 순수한 내용을 참조하거나 표준 입력을 읽어.

내가 하, 하?을 보내 줄 수 있도록 지금, 나에게 성적으로 노골적인 문을하자, RE는 옆으로 그것의 신비를 넣어
RE의 표현으로, 문자의 주요 두 가지 유형 (문자) :. 리터럴 및 메타는 문자를 소위에 같은 abc 방송, 이들 중 123 비 특수 기능 문자의 RE;

RE의 메타 사용 이스케이프 할 필요 메타 앞에 () 문자를 해제하는 특별한 기능을 가지고 있습니다. 그러나, 메타 도입하기 전에, 우리는 문자의 조합 (문자 집합) 더 좋을 것이다 알려 주시기 바랍니다.

소위 문자 세트는 예를 들어, 수집, 같은 연속 된 문자의 복수입니다 :

abc  : 表示 abc 三个连续的字符, 但彼此独立而非集合. (可简单视为三个 char. set)
(abc): 表示 abc 这三个连续字符的集合. (可简单视为一个 char. set)
abc|xyz: 表示或 abc 或 xyz 这两个 char. set 之一.
[abc] : 表示单一字符, 可为 a 或 b 或 c . (与 wildcard 之 [abc] 原理相同)
[^abc]: 表示单一字符, 不为 a 或 b 或 c 即可. (与 wildcard 之 [!abc] 原理相同)
.     : 表示任意单一字符. (与 wildcard 之 ? 原理相同)

char.set이 개념을 이해 한 후, 그 다음 우리가 몇 RE 공통의 메타 문자보다 더 알려 :

  • 앵커 (앵커) 공통의 RE 문장의 위치를 ​​식별 할 수 있습니다 :

  • ^: 表示句首. 如 ^abc 表示以 abc 开首的句子.
    $: 表示句尾. 如 abc$ 表示以 abc 结尾的句子.
    \<: 表示词首. 如 \<abc 表示以 abc 开首的词.
    \>: 表示词尾. 如 abc\> 表示以 abc 结尾的词.
  • 수정 자체가 문자 (수정)를하지 않는 경우 독립적으로 특별히 거기에 문자 이전의 일반적인 세트의 발생 횟수를 수정, 의미를 나타냅니다 .. :

    *: 表示前一个 char. set 的出现次数为 0 或多次. 如 ab*c 表示 a 与 c 之间可有 0 或多个 b 存在.
    ?: 表示前一个 char. set 的出现次数为 0 或 1 次. 如 ab?c 表示 a 与 c 之间可有 0 或 1个 b 存在.
    +: 表示前一个 char. set 的出现次数为 1 或多次. 如 ab+c 表示 a 与 c 之间可有 1 或多个 b 存在.
    {n}: 表示前一个 char. set 的出现次数必须为 n 次. 如 ab{3,}c 表示 a 与 c 之间必须有3 个 b 存在.{n,}: 表示前一个 char. set 的出现次数至少为 n 次. 如 ab{3,}c 表示 a 与 c  之间至少有 3 个 b 存在.
    {n,m}: 表示前一个 char. set 的出现次数为 n 到 m 次. 如 ab{3,5}c 表示 a 与 c 之间有3 到 5 个 b 存在.

우리가 수정 인식 그러나, "경계 (경계)"문자의 중요성을 간과하는 것은 매우 간단합니다. 그냥 언급 AB {3,5} C, A와 C는 문자의 경계 예에. 만약 어떤 도움 국경 문자, 그리고 우리는 잘못된 해석을 할 내용입니다.

예를 들면 : 우리는 AB는 {3,5} 재 (C 미만이 경계 문자) abbbbbbbbbbc 잡을 수 사용은이 맞춤법의 (a 후 10 B가)
수정 우리는 우리가 B를 원하는 생각하는 경향이 이전부터 이 범위를 벗어나, 우리가 표현하고 싶은없는 경우, 3-5입니다. 그래서, 우리는 이것이 매우 무모한 다시 캐치 결과라고 생각된다.
그러나, 대답은 왜 가능!는?
의 재 해석을 할 수 : AB {3,5}이 RE를 참조하십시오
우리가 3-5으로 접촉 B 후 뒤에 3-5을 표현하고자하지만 우리는 B 무엇인지 지정하지 않은, 따라서 RE 뒤에 임의의 문자가 될 수있다 포함, 물론 그것은 (? 당장 나가!) 수 b
마찬가지로, 우리는 단어의 문자열 abbbbbbbbbbc 잡을 수 또한 B {3,5} C를 사용합니다. 그러나 우리는이 c를 AB {3,5}을 사용하는 경우 RE,이 두 국경 문자 A와 C, 그것은 다른 이야기하면서부터!

有空再思考一下, 为何我们用下面这些 RE 都可抓到 abc 这串字呢?
x*
ax*, abx*, ax*b
abcx*, abx*c, ax*bc

bx*c, bcx*, x*bc
...(还有更多...)

우리는 이전과 같은 앵커 $ 이러한 RE ^ 후에있는 경우 그러나, 그것은을 조정하는 방법? 그냥 이러한 기본 메타 수 아마 시작 위 한 마스터로, RE를 배운다.

전술 한 바와 같이, RE는 주로 등 VI 그렙, 펄, AWK, 나오지 같은 도구를 처리 어떤 단어 사이에 들어 서면 표현의 표준화 된 방법은 캡처의 연속 스트링을 나타 내기 위해 사용 또는 교체합니다. 그러나, RE 표현의 각 도구의 특정 해석 또는 일부 미묘한 차이가 있지만 기본 원리는 동일합니다. 바와 같이만큼 RE의 기본 원칙을 마스터 할 수 후 명확한 근거는 모든 과학에 맞는,하지만 현실에서 다음과 같이 예를 들어 grep을 위해 약간의 작업을 할 수있을 때, 리눅스에 당신이, egrep을 grep을 찾을 이러한 절차를 fgrep 수의 차이는 다음과 같습니다

  • 그렙 : GREP 기존의 절차는 매개 변수가없는 경우, 문장의 문자열 만 출력 라인은 RE.
    공통 매개 변수로 다음과 같습니다 :
-v: 逆反模示, 只输出"不含" RE 字符串之句子.
-r: 递归模式, 可同时处理所有层级子目录里的文件.
-q: 静默模式, 不输出任何结果(stderr 除外. 常用以获取 return value, 符合为 true, 否则为
false .)
-i: 忽略大小写.
-w: 整词比对, 类似 \<word\> .
-n: 同时输出行号.
-c: 只输出符合比对的行数.
-l: 只输出符合比对的文件名称.
-o: 只输出符合 RE 的字符串. (gnu 新版独有, 不见得所有版本都支持.)
-E: 切换为 egrep .
  • egrep을 : GREP의 확장 버전이며, 기존의 그렙 동작의 많은 불편을 향상시킬 수 없습니다.
比方说:
grep 之下不支持 ? 与 + 这两种 modifier, 但 egrep 则可.
grep 不支持 a|b 或 (abc|xyz) 这类"或一"比对, 但 egrep 则可.
grep 在处理 {n,m} 时, 需用 \{ 与 \} 处理, 但 egrep 则不需.
诸如此类的... 我个人会建议能用 egrep 就不用 grep 啦.
  • fgrep :
    하지 RE 처리, 문자열 조작 만 일반적인 표현에 대한 .... 물론 모든 메타 손실 기능입니다
    항목-RE에, 나는 일시적으로 여기에 소개합니다.

추천

출처www.cnblogs.com/passzhang/p/12201551.html