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.

内部の正規表現は3つのコンポーネントに分けられます。

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

ファイル名はthen^で始まり/tmp/、スペース以外の文字が続く必要があり、その後にスペースが続き、スペース以外の文字(これをキャプチャ)が続く必要があり、スラッシュの前に来るすべての内容が続きます。

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

...空白以外の文字が続き(キャプチャ)、スラッシュの前にあるすべての文字

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

...後ろ(空白ではなく文字をキャプチャ) - 後ろに...私たちが気にしないこと。

Bashは、キャプチャされた括弧の順序に従って、これらのキャプチャされたビットをBASH_REMATCH配列に格納します。

おすすめ記事