ここに似た文字列があり、一致させよ../../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]?
一致しないのか、なぜエスケープして中かっこを使うのかということです。1
sdd1
?
答え1
デフォルトではsed
BREが使用され、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