awk 또는 sed는 디렉토리 경로의 요소를 구문 분석합니다.

awk 또는 sed는 디렉토리 경로의 요소를 구문 분석합니다.

길이가 다른 여러 디렉터리가 있다고 가정해 보겠습니다.

/tmp/(1) I. First Majuscule Roman Numeral/01. First Arabic Numeral/a. First Grapheme
/tmp/(2) II. Second Majuscule/03. Third Arabic/d. Fourth

구문 분석하고 싶기 때문에 출력은 다음과 같습니다.

I.01.a.
II.03.d.

awk 및/또는 sed 솔루션은 무엇입니까?

답변1

실제로 awk나 sed가 필요하지 않습니다. bash 와일드카드와 정규식 테스트를 사용하면 됩니다.

for d in /tmp/*/*/*
do
  if [[ $d =~ ^/tmp/[^[:space:]]+[[:space:]]([^[:space:]]*).*/([^[:space:]]*).*/([^[:space:]]*) ]]
  then
    printf "%s\n" "${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}"
  fi
done

예제 출력:

I.01.a.
II.03.d.

내부의 정규식은 세 가지 구성 요소로 나뉩니다.

  1. ^/tmp/[^[:space:]]+[[:space:]]([^[:space:]]*).*/

파일 이름은 then ^으로 시작해야 하며 /tmp/, 공백이 아닌 문자가 있어야 하고, 그 뒤에 공백이 오고, 공백이 아닌 문자(이것을 캡처)가 와야 하며, 슬래시 앞에 오는 모든 내용이 와야 합니다.

  1. ([^[:space:]]*).*/

...공백이 아닌 문자가 뒤따르고(캡처하여) 슬래시 앞에 있는 모든 문자

  1. ([^[:space:]]*)

... 뒤에 (공백이 아닌 문자를 캡처) -- 뒤에 ... 우리가 신경 쓰지 않는 것.

Bash는 캡처된 괄호의 순서에 따라 이러한 캡처된 비트를 BASH_REMATCH 배열에 저장합니다.

답변2

이것들은 다음과 같다고 가정하자오직다음 디렉토리 /tmp:

$ find /tmp -mindepth 3 -type d -print | sed -e 's/\.[^/]*/./g' -e 's/^.* //' -e 's#/##g'
I.01.a.
II.03.d.

find명령은 레벨 3 디렉토리를 찾고 전체 경로를 인쇄합니다. 이 단계의 결과는

/tmp/(1) I. First Majuscule Roman Numeral/01. First Arabic Numeral/a. First Grapheme
/tmp/(2) II. Second Majuscule/03. Third Arabic/d. Fourth

sed명령은 세 가지 작업을 수행합니다.

  1. 점부터 다음 슬래시까지의 모든 것을 점으로 대체하여 생성합니다.

    /tmp/(1) I./01./a.
    /tmp/(2) II./03./d.
    
  2. 첫 번째 공백까지 비트를 제거하고,

    I./01./a.
    II./03./d.
    
  3. 슬래시를 제거하고,

    I.01.a.
    II.03.d.
    

답변3

아, awk아직 답변이 없어서…

awk -v FS="" '
{
    for (i=1;i<=NF;i++) {
        if ($i==" " || $i=="/") {
            part=""
        } else if ($i==".") {
            printf "%s.", part
        } else {
            part=part FS $i
        }
    }
}
END { printf "\n" }'

필드 구분 기호를 ""로 설정하면 각 문자를 반복할 수 있습니다. 현재 문자에서 "" 또는 "/"를 찾고, 발견되면 홀더(부분 변수)를 재설정합니다. "."가 발견되면 홀더를 인쇄하고, 그렇지 않으면 현재 문자를 홀더에 연결합니다. 완료되면 줄바꿈을 추가합니다.

예제 출력:

I.01.a.
II.03.d.

관련 정보