길이가 다른 여러 디렉터리가 있다고 가정해 보겠습니다.
/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.
내부의 정규식은 세 가지 구성 요소로 나뉩니다.
^/tmp/[^[:space:]]+[[:space:]]([^[:space:]]*).*/
파일 이름은 then ^
으로 시작해야 하며 /tmp/
, 공백이 아닌 문자가 있어야 하고, 그 뒤에 공백이 오고, 공백이 아닌 문자(이것을 캡처)가 와야 하며, 슬래시 앞에 오는 모든 내용이 와야 합니다.
([^[:space:]]*).*/
...공백이 아닌 문자가 뒤따르고(캡처하여) 슬래시 앞에 있는 모든 문자
([^[: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
명령은 세 가지 작업을 수행합니다.
점부터 다음 슬래시까지의 모든 것을 점으로 대체하여 생성합니다.
/tmp/(1) I./01./a. /tmp/(2) II./03./d.
첫 번째 공백까지 비트를 제거하고,
I./01./a. II./03./d.
슬래시를 제거하고,
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.