$ 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/_/;/'