2016-03-21 18 views
0

ディレクトリツリーの中で最も長いパスを表示する機能を持っています。関数がこれを出力するとしましょう:./.mozilla/firefox/z6upkljn.default/storage/permanent/chrome/idb/2918063365piupsah.filesUnix:文字列を正規表現の区切り文字で切り取る

私がしたいのは、この文字列をユーザー定義の正規表現とマッチさせた後にカットすることです。

たとえば、ユーザーが*de?a*のような正規表現を入力した場合、唯一の一致はz6upkljn.defaultです。そう終わりに、出力はここ./.mozilla/firefox

あろう私はMy_expressionがユーザによって定義された切断用区切り正規表現あるsed 's/My_expression.*//' を発見したサンプルコードです。

この入力では$echo /homes/eva/xm/xmikfi00 | sed 's/mik.*//'が動作します。出力は/homes/eva/xm/xです。予想通り。

しかし、単純正規表現$echo /homes/eva/xm/xmifki00 | sed 's/mi?.*//'を入力すると、出力は/homes/eva/xm/xmikfi00になります。前の例と同じ出力を得る方法を教えてもらえますか?

ご協力いただきありがとうございます。ありがとうございました。

+0

ここで区切りのルールは何ですか? –

+0

区切りはユーザーによって定義され、正規表現を拡張することができます。 – FilipMik

+0

のような_regex:* de?a *、唯一の一致はz6upkljn.default_です。ここのルールは何ですか? –

答えて

1

Sedは(デフォルトで)POSIX BREを使用し、EREは使用しません。 ?と一致させようとしているものが「任意の文字」である場合は、.echo /homes/eva/xm/xmifki00 | sed 's/mi..*//'を使用してください。

詳細はman 7 re_formatを参照してください。

+0

EREs-friendlyにする方法はありますか? – FilipMik

+0

はい。その言語の 'glob'ライブラリを呼び出すsh、bash、perl、pythonなどを使って独自のコードを書いてください。あるいは、globを正規表現に変換することは難しくありません。おそらく、あなたはどのようにうまく動くかの感覚を得るために 'man bash'を行うべきです。 –

+1

はい、その非標準ですが。 BSDベースの 'sed'は' -E'オプションを持ち、GNU 'sed'は' -r'を使います。それでも、これらのどちらも '? 'を任意の文字にマッチさせることはできません。これは、POSIX正規表現構文のいずれかの特徴ではありません。 –

関連する問題