sedの空白を一致させる方法は?


218

sedの空白をどのように一致させることができますか?私のデータでは、3つ以上の後続の空白文字(タブスペース)をすべて一致させ、それらを2つのスペースに置き換えます。これをどのように行うことができますか?

回答:


226

文字クラス\sは空白文字<tab>とに一致します<space>

例えば:

$ sed -e "s/\s\{3,\}/  /g" inputFile

少なくとも3つの空白のすべてのシーケンスを2つのスペースに置き換えます。


:POSIX準拠の場合は、の[[:space:]]代わりに文字クラスを使用して\sください。後者はGNU sed拡張機能であるためです。sedおよびBREの POSIX仕様を参照してください


5
ああ!それは行方不明の-eスイッチでした。
セコイアマクダウェル

25
また、拡張正規表現を有効にしてsedがスペースとして「\ s」を認識できるようにする「-r」スイッチを追加する必要がありました。
HUB

39
Appleのsed場合、私にとってはうまくいかなかった[[:space:]]ので使用しなければなり\sませんでした。おそらく、\sあるGNU sedの拡張は?
ジャレッドベック

2
@JaredBeckのおかげで..これはラメで、なぜ私の簡単な正規表現波平の作業アイデアを実行していた、私は、\ sは標準の拡張正規表現でした..また-r doesntの仕事と-Eはスクワットやったと思った
カルティクT

3
代わりに、水平タブとスペースのみに一致[[:space:]するものを使用できます[[:blank:]](ただし、改行、垂直タブなどは使用できません)。
-stefanct

67

これはMacOS 10.8で動作します:

sed -E "s/[[:space:]]+/ /g"

2
これがすべてのLinuxディストリビューションで機能するかどうか知っていますか?
両生類14

2
一般的には、GNU sedには-Eはありません。BSD sed manページから:「-E、-a、および-iオプションは非標準のFreeBSD拡張機能であり、他のオペレーティングシステムでは利用できない場合があります。」
ブラッドコッホ14年

1
+演算子に-Eフラグが必要なのはなぜですか?ほとんどの式はおそらく*で代用できますが、他のプラットフォームでも機能します。
サミュエル

5
@Samuel *を使用すると、正規表現は0個以上のスペースに一致し、各文字の間にスペースが入り、各行の両端にスペースが入ります。-Eフラグがない場合は、sed "s/[[:space:]]\+/ /g"1つ以上のスペースを一致させます。
jbo5112

1
FWIW、NetBSDのsedは-Eフラグもサポートしています。
mcandre

13

sedの古いバージョンの中には、\ sをトークンに一致する空白として認識しないものがあります。その場合、1つ以上のスペースとタブのシーケンスを '[XZ] [XZ] *'と一致させることができます(Xはスペース、Zはタブ)。


1
したがって、古いsedを使用して特定のニーズに対応するには、次のようにします。$ sed 's / [XZ] [XZ] [XZ] [XZ] * / / g'入力ファイル(Xはタブ、Zはスペース)
マーニックスA.ヴァンアンマーズ

10
sed 's/[ \t]*/"space or tab"/'

2
これはsed、どのシステムのどのバージョンでも動作することが保証されていますか?そうでない場合、これが他の回答と同様の方法で機能する場所を言及する価値があるかもしれません、ちょうど私たちが制限を知っているので、これが意図した結果をもたらさないかもしれません。
木梅

2
このREは、空白を一致させるために使用するものです。タブまたはスペースに一致するだけで、文字クラスよりも簡単です。正規表現の最も基本的な規則のみを使用するため、正規表現の機能的な実装であればどこでも機能するはずです。
ネイト14年

3
Mac 10.9.5では、これはスペースと「t」に一致します。上記のMichael Doumaを使用して、空白文字に一致させました(-eでも動作します)。
エイリアン生命体

私のSUSEシステムではうまく動作しません。0個以上のスペースがある行の最初の場所(最初の文字の前)と一致します。私はそれが意図された機能であるとは思わず、確かに要求されたユースケースではなかった。'\ +'(または質問ごとに '\ {3、\}')の '*'を変更し、パターンのすべての出現に一致するようにsedコマンドの最後にagを追加することをお勧めします。また、行に空白文字が他にある場合、[\ t]を[[:space:]]に置き換えることも望ましい場合があります。
jbo5112
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.