2016-08-29 9 views
1

([^/]+) sed regexが正しく動作することができません。
スラッシュ以外のスラッシュ文字をすべて返す代わりに、1つのみを返します。なぜ、このsedコマンドでプラスが正しく動作しないのですか?

コマンド:期待

echo '/test/path/file.log' | sed -r 's|^.*([^/]+)/(.*)$|\1.\2|g' 

path.file.log 

結果:

h.file.log 

もこれを試みたが、同じ結果だ:問題は[^/]+ではありませんが、前の.*

echo '/test/path/file.log' | sed -r 's|^.*([^/]{1,})/(.*)$|\1.\2|g' 

答えて

2

を。 .*は貪欲であり、最大量の入力を消費します。私の通常の提案は、それを非貪欲にするために.*?を使うことですが、POSIX正規表現はその構文をサポートしていません。

常にスラッシュがある場合は、余分に消費しないように1つを正規表現に追加できます。

$ echo '/test/path/file.log' | sed -r 's|^.*/([^/]+)/(.*)$|\1.\2|g' 
path.file.log 
+1

スラッシュが必ずしも先行するとは限りませんが、その部分をオプションにするには、 '^(。* /)?([^ /] +)'が必要です。バックワードを増やして考慮する必要があります余分なグループの –

0

OSesは異なるバージョンのsedを使用します。 sedバージョンの中には、デフォルトでregexpの基本構文を使用するものがあります。拡張正規表現構文(+がそれらの機能の1つ)を必要とする場合は、-Eでオプションを切り替える必要があります。

関連する問題