ファイルパスの不要な/の削除 [Linux]
以下は、備忘録としてまとめたものである。
1. 要求仕様
ファイルパスから不要な / を取り除く。
・/ が連続する部分を / に変更
・最後の / を削除
2. 実行例
(1) sed の場合
(a) 基本正規表現を使用する場合
% echo ..//aa//bb//cc// | sed -e 's!/\{2,\}!/!g' -e 's!\([^/]\)/$!\1!' ../aa/bb/cc % echo /// | sed -e 's!/\{2,\}!/!g' -e 's!\([^/]\)/$!\1!' /
(b) 拡張正規表現を使用する場合
% echo ..//aa//bb//cc// | sed -r -e 's!/+!/!g' -e 's!([^/])/$!\1!' ../aa/bb/cc % echo /// | sed -r -e 's!/+!/!g' -e 's!([^/])/$!\1!' /
(c) 失敗例
% echo ..//aa//bb//cc// | sed -e 's!/*!/!g' -e 's!\([^/]\)/$!\1!' /././a/a/b/b/c/c
(2) awk の場合
% echo ..//aa//bb//cc// | \ awk '{gsub(/\/+/, "/"); r=gensub(/([^/])\/$/, "\\1", 1); print r}' ../aa/bb/cc % echo /// | \ awk '{gsub(/\/+/, "/"); r=gensub(/([^/])\/$/, "\\1", 1); print r}' /
(補足)
・gsub() および sub() では "\\1" が機能しない。
・gensub() の戻り値は変換後の文字列である(元の文字列を変更しない)。
3. sed の正規表現
基本正規表現と拡張正規表現(-r オプションの指定)が使用できる。
また、それぞれの特徴は、下記の通りである。
(1) 基本正規表現 (BRE: Basic Regular Expression)
(a) +、? での繰り返しには \ でのクォートが必要
\+: \{1,\} と同じ
\?: \{,1\} と同じ
(b) グループ化には \ でのクォートが必要
\(.*\)
(c) 繰り返しには \ でのクォートが必要
\{m,n\}
(d) 論理和の指定には \ でのクォートが必要
a\|b
(2) 拡張正規表現 (ERE: Extended Regular Expression)
(a) +、? での繰り返しには \ でのクォートが不要
+: {1,} と同じ
?: {,1} と同じ
(b) グループ化には \ でのクォートが不要
(.*)
(c) 繰り返しには \ でのクォートが不要
{m,n}
(d) 論理和の指定には \ でのクォートが不要
a|b
コメント 0