1行の中にある、連続した2文字以上の空白類を、それぞれ半角スペース1文字へ置換する。
同じ行に対象が複数あっても、すべて置換する。GNU sedを使用する。
red green blue期待結果を得るコマンドはどれか。
sed -EでEREを有効にし、{2,}で2文字以上の連続、gフラグで各行のすべての一致を置換する。
詳細解説
sed 's/[[:space:]]{2,}/ /g' colors.txt既定のBREでは{2,}をそのまま量指定子として扱わない。
誤りです。sedの既定はBREです。
BREで波括弧を量指定子として使うには書き方が異なるため、このパターンは意図どおりになりません。
sed -E 's/[[:space:]]{2,}/ /' colors.txt最初の一致だけを置換するため、greenとblueの間の空白が残る。
誤りです。-Eと{2,}により最初の連続空白には一致します。
末尾のgがないので各行の最初の一致だけを置換し、2か所目の連続空白が残ります。
sed -E 's/[[:space:]]/ /g' colors.txt各空白を1文字ずつ空白へ置換するだけなので、連続数は減らない。
誤りです。空白1文字ずつを同じ空白1文字へ置き換えます。
すべて置換しても入力の空白数は変わらず、連続空白を縮められません。
sed -E 's/[[:space:]]{2,}/ /g' colors.txt-Eで{2,}を量指定子として使い、gで1行内の全一致を置換する。
正しい選択肢です。{2,}が連続した空白列を1つの一致として捉えます。
gにより1行内の複数の空白列をすべて処理し、それぞれ空白1文字へ置換します。
実際に確かめる
一時的な検証環境で実行できる例です。
printf 'red green blue
' > colors.txt
sed -E 's/[[:space:]]{2,}/ /g' colors.txt期待される結果
red green blue理解のポイント
- {2,}は2回以上の繰り返し
- gなしでは各行の最初の一致だけ
- sedの既定はBRE
確認時の注意
- 確認環境: GNU sed 4.x
- この例はGNU sedの-Eを使用します。
- タブも[[:space:]]へ一致し、置換結果は半角スペースになります。
基礎のおさらい
量指定子
{m,n}は直前の要素の繰り返し数を指定します。{2,}は上限なしの2回以上です。
gフラグ
gがなければ、sedのsコマンドは各行の最初の一致だけを置換します。入力全体で1回という意味ではありません。
標準出力と元ファイル
通常のsedは結果を標準出力へ書き、元ファイルを変更しません。直接編集する-iは別の指定です。