x
1つを見つけて、次の0個以上のスペース(\s*
)を1つのスペースに置き換えたいと思います。
echo "x ax" | sed 's/x\s*/x /'
何らかの理由でスペースを単一のスペースに置き換える代わりに、以前に存在していた複数のスペースにスペースを追加します。
x ax
フラグをどのように使用しても、+
代わりに使用することはまったく意味がないようです。*
-E
sed
貪欲ではない表現を実行しないようですが、なぜマッチング時に空白を*
すべて消費しないのですか?
私はbashではなく設定の正規表現の忍者ですが、bashとそのツールは私を山菜に食べます。成功した検索エンジンクエリのためにこれをどのように簡潔に表現するのかわかりません。
答え1
sed
期待する基本正規表現(着替え)。\s
BREの標準特殊構造ではありません。むしろ(その問題について)これは、一部の言語、特にPerl(他の多くの言語がこれを模倣する)の拡張です。 sedでは、実装に応じて\s
リテラル文字列\s
またはリテラル文字を表しますs
。
実装では\s
match のように見えるので0 以上と一致しs
、サンプル入力では matchなので に変換されます (等に変換されます)。他の実装(たとえば、GNU sedを使用)ではmatchなので、一致の後にゼロ個以上のバックスラッシュが続きます。これは入力には表示されないため、行は変更されません。\s*
s
x\s*
x
x ax
x ax
xy
x y
\s
\s
\s*
s
これは貪欲とは関係ありません。貪欲は、文字列が正規表現と一致するかどうかには影響せず、一致からキャプチャされる文字列部分にのみ影響します。
答え2
私はあなたがsedとgrepフラグを混同していると思います。 -E は正規表現を拡張する grep フラグです。 -r は拡張正規表現の sed フラグです。以下は私にとって効果的でした。
echo "x ax" | sed -r 's/x\s*/x /'
それは作り出す
x ax