このsed表現にはどのような問題がありますか?

このsed表現にはどのような問題がありますか?
$ echo "104_Fri" | sed 's/^\([0-9]+\)_\([A-Za-z]+\)$/\1;\2/'
104_Fri

開始番号と終了文字をそれぞれグループに一致させたい。次に、最初のグループ、セミコロン、2番目のグループを出力したいと思います。

私はこの式が次を生成したいと思います:

104;Fri

なぜこれがうまくいかないのですか?

答え1

バックスラッシュ+:

$ echo "104_Fri" | sed 's/^\([0-9]\+\)_\([A-Za-z]\+\)$/\1;\2/'
104;Fri

気づく+標準の基本正規表現メタ文字ではありません。したがって、バックスラッシュを使用しても移植可能な動作はありませんsed

有効またはsed -r有効sed -Eにする必要があります。拡張正規表現代わりに、これらの文字をバックスラッシュする必要はありません。これらのオプションも非標準ですが、サポートされていないと、不明な欠陥ではなく、少なくともエラーが発生します。このオプションは以下をサポートします。牛に似た一種の栄養sedそしてすべての主要なBSD派生物(FreeBSDオープンBSDネットワークBSDオペレーティングシステム)、しかし、多くの商用Unixバージョンではそうではありません。

移植性に優れた拡張正規表現が必要な場合は、以下を使用してください。awk、常に使用してください

答え2

プラス記号もエスケープする必要があります+

$ echo "104_Fri" | sed 's/^\([0-9]\+\)_\([A-Za-z]\+\)$/\1;\2/'
104;Fri

答え3

正規表現拡張のオプションが追加されました。 ;-)-rアクティブコンテンツの必要性を減らします。\

$ echo "104_Fri" | sed -re 's/^([0-9]+)_([A-Za-z]+)$/\1;\2/'
104;金曜日

Qを作成するとき、分割操作(背景データなし)はいくつかの簡単な方法で実行できます。

$ echo "104_Fri" | tr '_' ';'
104;金曜日

$echo "104_Fri" sed 's/_/;/'
104;金曜日

...2つの例だけを聞きます。

答え4

Perl はほとんどの Unix システムにプリインストールされているので、使用をお勧めします。

$ echo '104_Fri' | perl -p -e 's/^([0-9]+)_([A-Za-z]+)$/$1;$2/'

次のようにさらに簡素化できます。

$ echo '104_Fri' | perl -p -e 's/^(\d+)_([a-z]+)$/$1;$2/i'

メモ:入力が実際に質問と同じくらい簡単な場合は、次の手順を実行しますtr

$ echo '104_Fri' | tr '_' ';'

またはPerlを使用してください。

$ echo '104_Fri' | perl -p -e 's/_/;/'

関連情報