SSブログ

ファイルパスの不要な/の削除 [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



nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。