正規表現文字がsedで一致する項目を生成しないのはなぜですか? [コピー]

正規表現文字がsedで一致する項目を生成しないのはなぜですか? [コピー]

ここに似た文字列があり、一致させよ../../sdd1うとしていますsdd。次のコマンドを使用しようとしますsed

echo "../../sdd1" | sed 's:.*\([a-z]\{3\}\)[0-9]?:\1:' 

そして、一致する項目は生成されません。
しかし、私が使うとき

echo "../../sdd1" | sed 's:.*\([a-z]\{3\}\)[0-9]\{0,1\}:\1:'

その後、一致するものを得ましたsdd

私の推測では、?中括弧と同様に、これもエスケープする必要があるということです。試してみましたが効果がありましたが、理由はわかりません。

だから質問は、なぜ正規表現が[0-9]?一致しないのか、なぜエスケープして中かっこを使うのかということです。1sdd1?

ベストアンサー1

デフォルトではsedBREが使用され、EREは必須-Eまたはオプションで使用可能です。-r

から引用GNU sed マニュアル

GNU sedのデフォルト正規表現と拡張正規表現の唯一の違いは、「?」、「+」、括弧、中括弧(「{}」)、および「|」などの一部の特殊文字の動作です。

基本 (BRE) 構文の場合、これらの文字は、前にバックスラッシュ ('\') がなければ特別な意味はありません。拡張(ERE)構文の場合は逆です。これらの文字は、前にバックスラッシュ(')がなければ特殊です。 \ ')はプレフィックスです。

そのためには次のようにGNU sedしてください。

$ echo '../../sdd1' | sed 's:.*\([a-z]\{3\}\)[0-9]\?:\1:'
sdd
$ echo '../../sdd1' | sed -E 's:.*([a-z]{3})[0-9]?:\1:'
sdd

~のためPOSIX BRE、2番目のコマンドは行く方法です

$ echo '../../sdd1' | sed 's:.*\([a-z]\{3\}\)[0-9]\{0,1\}:\1:'
sdd

おすすめ記事