一致する前に行の先頭をスキップするように正規表現に指示します。

一致する前に行の先頭をスキップするように正規表現に指示します。

このような文字列があり、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

関連情報