LinuCレベル1 GNUとUnixのコマンド 問34
GNUとUnixのコマンド/正規表現を使用したテキストファイルの検索次のコマンドを実行したときの出力として正しいものはどれか。 echo "abc-123" | sed -E 's/([a-z]+)-([0-9]+)/\2-\1/'
当サイトのオリジナル問題(LinuCレベル1の出題範囲「GNUとUnixのコマンド」に対応。実際の試験問題ではありません)
- Aabc-123
- B321-cba
- C123-abc
- D123abc
正解:C
解説
sed -E は拡張正規表現を使う指定で、丸括弧 ( ) で囲んだ部分がグループとして記憶されます。置換後の文字列では、1つ目のグループに一致した文字列を \1、2つ目を \2 で参照できます(後方参照)。この例では \1 が「abc」、\2 が「123」に一致するため、置換結果は「123-abc」となります。-E を付けない基本正規表現では、グループを \( \) のようにバックスラッシュ付きで書く必要があります。
選択肢ごとの解説
- A誤り。パターンは「abc-123」全体に一致するので置換が行われ、元の文字列のままにはなりません。
- B誤り。後方参照はグループに一致した文字列をそのまま取り出すもので、文字の並びを逆順にはしません。
- C正しい。2つ目のグループ「123」、ハイフン、1つ目のグループ「abc」の順に並べ替えられます。
- D誤り。置換後の文字列 \2-\1 にはハイフンが含まれているので、結果にもハイフンが残ります。