정규식을 단축하는 방법을 알고 싶습니다.

정규식을 단축하는 방법을 알고 싶습니다.

1GB 이상의 모든 디렉토리를 나열하려고 합니다. 을 사용할 수 있다는 것을 알고 있지만 ncdu지금은 정규 표현식을 단축하는 방법을 알아내려고 노력하고 있습니다.

이 명령을 찾았 du -h . | grep '[0-9\.]\+G'지만 작동 방식을 이해할 수 없습니다.

나는 정규 표현식을 아는 방식으로 작성해 보았고 이것이 내가 생각해낸 것입니다:
du -h . | grep '[0-9]\+\.*[0-9]*G

첫 번째 명령은 0부터 9까지를 찾은 다음 마침표를 찾는 것으로 생각됩니다. 이는 \+하나 이상을 의미하므로 모든 결과는 다음과 같습니다.요점이 없어제외했어야 했지만 그렇지 않았습니다.

첫 번째 명령은 이렇지 않아야합니까? grep '[0-9\.]*G'

감사해요.

답변1

음, [...]범위(로케일에 따라 다름)를 따라 그 안에 나열된 단일 문자와 일치하는 대괄호 그룹입니다. [0-9\.]0에서 9까지의 숫자, 백슬래시 또는 점과 일치합니다. 아마도 점이 이스케이프되어야 한다고 생각했기 때문에 거기에 백슬래시를 추가했을 것입니다. 그러나 대괄호 그룹 내부에서는 그렇지 않습니다.

표준 BRE(기본 정규 표현식)에서는 \+정의되지 않으므로 정규 표현식이 사실상 유효하지 않습니다. GNU 시스템에서는 +확장 정규 표현식(ERE) 처럼 작동하며 앞의 정규 표현식과 일치합니다. 다른 시스템에서는 다른 작업을 수행할 수도 있습니다. G텍스트 만 일치합니다 G.

여기서는 GNU 특정 표현식을 사용할 이유가 없습니다. 표준 ERE로 다시 작성하고 grep에게 BRE 대신 이를 사용하도록 지시할 수 있기 때문입니다. 그럴 수도 있지

grep -E '[0-9.]+G'

최소한 하나의 숫자나 점 뒤에 G가 표시됩니다.

첫 번째 명령은 0부터 9까지를 찾고 그 다음에는 마침표를 찾는 것 같습니다.

아니요, 대괄호 표현식에는 순서가 없습니다. [xyz.]동일합니다 [z.yx]. 이면 [0-9]\.점이 뒤따르는 단일 숫자를 찾습니다. (여기서는 점을 이스케이프 처리해야 합니다.)

첫 번째 명령은 이렇지 않아야합니까?grep '[0-9\.]*G'

이는 숫자(또는 점)를 선택 사항으로 만들고 와 일치합니다 . 실제로 원본 텍스트의 "one or more" G는 표현식이 시작 부분에 고정되어 있지 않기[0-9.]G 때문에 필요하지 않습니다. 또는 포인트)도 암시적으로 허용됩니다. (즉, 123G일치 3G하고 grep은 여전히 ​​전체 줄을 인쇄합니다.)

( [0-9]일치할 수 있는 문자는 가 아니라 0123456789, 숫자에 따라 정렬된 다른 문자가 있는 경우 로케일의 정렬 순서에 따라 다릅니다.)


du디렉터리 크기와 이름이 포함된 출력의 경우 grep은 1G예를 들어 경로 이름에 포함된 모든 줄과도 일치합니다. 또한 du크기를 TB 등으로 인쇄할 수 있으면 비슷한 크기의 줄을 놓칠 수 있습니다 1.2T. 이를 방지하려면 표현식을 줄 시작 부분에 고정하고 최소한 다음을 추가해야 합니다 T.

du -h . | grep -E '^[0-9.]+[GT]'

+(줄의 시작 부분과 or 사이에서 단일 숫자(또는 점) 만 찾기 때문에 이것이 필요합니다 ^[0-9.][GT]. 즉, 찾기는 하지만 찾지는 않습니다.)GT1G1.2G

또는 예를 들어 다음을 사용하십시오.

du -h . | awk '$1 ~ /[GT]/'

(실제로 숫자를 찾을 필요가 없습니다. 우리는 숫자가 거기에 있다는 것을 알고 있습니다.)

관련 정보