過去問ドリル

LinuCレベル1 GNUとUnixのコマンド 問34

GNUとUnixのコマンド/正規表現を使用したテキストファイルの検索

次のコマンドを実行したときの出力として正しいものはどれか。 echo "abc-123" | sed -E 's/([a-z]+)-([0-9]+)/\2-\1/'

当サイトのオリジナル問題(LinuCレベル1の出題範囲「GNUとUnixのコマンド」に対応。実際の試験問題ではありません)

正解: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 にはハイフンが含まれているので、結果にもハイフンが残ります。
LinuCレベル1の問題を演習モードで解く