長さの異なる複数のディレクトリがあるとします。
/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つのコンポーネントに分けられます。
^/tmp/[^[:space:]]+[[:space:]]([^[:space:]]*).*/
ファイル名はthen^
で始まり/tmp/
、スペース以外の文字が続く必要があり、その後にスペースが続き、スペース以外の文字(これをキャプチャ)が続く必要があり、スラッシュの前に来るすべての内容が続きます。
([^[:space:]]*).*/
...空白以外の文字が続き(キャプチャ)、スラッシュの前にあるすべての文字
([^[:space:]]*)
...後ろ(空白ではなく文字をキャプチャ) - 後ろに...私たちが気にしないこと。
Bashは、キャプチャされた括弧の順序に従って、これらのキャプチャされたビットをBASH_REMATCH配列に格納します。