![正規表現文字がsedで一致する項目を生成しないのはなぜですか? [コピー]](https://linux33.com/image/114948/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E6%96%87%E5%AD%97%E3%81%8Csed%E3%81%A7%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E9%A0%85%E7%9B%AE%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
ここに似た文字列があり、一致させよ../../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