このような文字列があり、45mb ./aaaa/bbbb/cccc/dddd
そのような正規表現を使用すると[^\/]*\/
一致します。45mb ./aaaa/bbbb/cccc/
ちょうど一致させたいのですが、./aaaa/bbbb/cccc/
方法がわかりません。
sed
以下のコマンドで一致を置き換えるために使用したいのですが、sed
最初はファイルサイズビットを失うことなく、スラッシュ前のすべての項目、スラッシュを含むすべての項目を具体的に一致/検索したいと思います。
sed -e 's/[^\/]*\//--/g
これが意味があることを願っています。前方/後方を探しましたが、これが正しい正規表現ソリューションかどうかわかりません。
答え1
Gnoucの答えへのコメントで欲しいものを明確にしたので、解決策は次のとおりです。
sed 's|[^ /]*/|--|g'
$ echo '45mb ./aaaa/bbbb/cccc/dddd' | sed 's|[^ /]*/|--|g'
45mb --------dddd
後ろにスラッシュがある場合、または渡すファイルパスにスペースが含まれている場合は中断されます。もっと細かいスクリプトを書くのはとても簡単ですが、1行以上のコンテンツが必要です。
キャプチャグループを使用するソリューションは次のとおりです。
sed -e 's|\([^ ]* \).*/\(.*\)|\1\2|'
sを区切り文字として使用する理由は、スラッシュをエスケープする必要がないためですが、パターンからsをエスケープする必要があります|
。|
AFAIKsed
ほとんどすべての文字を区切り文字として使用できます。
最初のキャプチャグループは、\([^ ]* \)
「スペースを除くすべての文字とスペースが続く文字」と一致します。.*/
「スラッシュが来るすべての文字数」と一致し、2番目のグループは\(.*\)
「すべての文字数」をキャプチャします。
Sedの正規表現(およびほとんどの正規表現)は基本的に貪欲なので、そのパターンに.*/
一致する最も長い文字列と一致します。
$ echo '45mb ./aaaa/bbbb/cccc/dddd' | sed 's|\([^ ]* \).*/\(.*\)|\1\2|'
45mb dddd
しかし、後ろにスラッシュがあると中断されます。
$ echo '45mb ./aaaa/bbbb/cccc/dddd/' | sed 's|\([^ ]* \).*/\(.*\)|\1\2|'
45mb
このバージョン〜するこれは末尾のスラッシュでも機能しますが、スラッシュが複数ある場合は中断されます。
sed -e 's|\([^ ]* \).*/\(.\)|\1\2|'
$ echo '45mb ./aaaa/bbbb/cccc/dddd/' | sed 's|\([^ ]* \).*/\(.\)|\1\2|'
45mb dddd/
$ echo '45mb ./aaaa/bbbb/cccc/dddd//' | sed 's|\([^ ]* \).*/\(.\)|\1\2|'
45mb /
答え2
正規表現とPerlを使用するソリューションは次のとおりです。
$ echo '45mb ./aaaa/bbbb/cccc/dddd' | perl -ne 'print $1 if /(\.\/.*\/)/'
./aaaa/bbbb/cccc/
そして、次のものを交換してください:
$ echo '45mb ./aaaa/bbbb/cccc/dddd' | perl -ple 's/(\.\/.*\/)/--/'
45mb --dddd