Mac OSXのbashスクリプトで私の正規表現がsedで動作しないのはなぜですか?

Mac OSXのbashスクリプトで私の正規表現がsedで動作しないのはなぜですか?

CBX-1234文字列CBX-1234--CBX-5678またはから文字列を取得しようとしていますCBX-12345--CBX-5678。 Mac OSXでbashスクリプトを使用し、sedを使用して正規表現を実行しています。

string="CBX-1234--CBX-5678"
shortenedString=$(echo "$string" | sed "s/^([A-Za-z]+-[0-9]+)/\1/")

これにより、次のエラーメッセージが出力されます。

sed: 1: "s/^([A-Za-z]+-[0-9]+)/\1/": \1 は RE で定義されていません。

部分文字列をキャプチャする方法は? bashでsedや他の手段を使用するための提案を歓迎します。

答え1

拡張正規表現を使用するには、コマンドライン-Eに以下を追加する必要があります。sed

sed -E 's/^([A-Za-z]+-[0-9]+)/\1/'

CBX-1234--CBX-5678文字列をに減らすには、CBX-1234文字列全体を考慮して代替項目も変更する必要があります。

sed -E 's/^([A-Za-z]+-[0-9]+).*/\1/'

bashパラメータ拡張も使用できます。

shortenedString="${string%%--*}"

$stringこれにより、最初に発生した以降のすべての項目が削除されます--

答え2

私はいつも使うsed -r

$ echo "abhellocd" | sed -r "s/.*(hello).*/\1/g"
hello

sedのマニュアルページから:

   -r, --regexp-extended
          use extended regular expressions in the script.

このオプション-Eは私がリストしたものではありません。それも動作しますが。

答え3

あなたはそれを使用することができますecho "$string" | cut -d "-" -f 1,2

関連情報