sedはすべてのタブとスペースを単一のスペースに置き換えます


23

次のような文字列を取得しました。

test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

次に、レコード間のすべてのタブ/スペースを単一のスペースに置き換えて、簡単に使用できるようにします cut -d " "

私は次を試しました:

sed "s/[\t[:space:]]+/[:space:]/g"

さまざまなバージョンがありますが、動作させることができませんでした。何か案は?


試してください:sed -r -e "s / [\ t \] + / / g"
RJS

あなたのいcutサポートの-wオプションは?
コンディバス14

回答:


40

つかいます sed -e "s/[[:space:]]\+/ /g"

説明は次のとおりです。

[   # start of character class

  [:space:]  # The POSIX character class for whitespace characters. It's
             # functionally identical to [ \t\r\n\v\f] which matches a space,
             # tab, carriage return, newline, vertical tab, or form feed. See
             # https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

]   # end of character class

\+  # one or more of the previous item (anything matched in the brackets).

交換する場合は、スペースのみを挿入します。[:space:]それは文字クラスの略語であり、正規表現エンジンはそこにどの文字を配置するのかわからないため、そこでは動作しません。

+理由のsedの正規表現エンジンを正規表現でエスケープしなければならない+のに対し、通常の文字である\+「一つ以上」のメタ文字です。正規表現マスタリングの 86ページで、ジェフリー・フリードルは脚注で、edとgrepがエスケープされた括弧を使用したと述べています。 」私は彼がプラス記号について同じように感じていたので、それをエスケープしてメタキャラクターとして使用する必要があると思います。これで簡単につまずくのは簡単です。

あなたがエスケープする必要がありますsedは+?|(、と)。または-rを使用して拡張正規表現を使用します(その後、sed -r -e "s/[[:space:]]\+/ /g"またはsed -re "s/[[:space:]]\+/ /g"


これによりタブも削除されますか?なぜ\+代わりに使用するのか説明できます+か?
ズラキス

はいわかりました。[[:space:]]は[\ t \ r \ n \ v \ f]と同じです。しかし、あなたが使用する理由を説明してください\+
Zulakis

3
[[:space:]]は '\ s'と同等であるため、短いバージョンは "s / \ s \ + / / g"
3molo

2
基本的な正規表現は、「前の文字またはグループの1つまたは複数」、ソースdeveloper.apple.com/library/mac/#documentation/opensource/…を意味するために使用される場合、プラス記号の前にバックスラッシュを使用します。
モーロ

ああ、わかった!異なる正規表現バージョンがあることを知りませんでした。ありがとう
ズラキス

6

次の-s( "squeeze")オプションを使用できますtr

$ tr -s '[:blank:]' <<< 'test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

[:blank:]文字クラスは、スペースとタブの両方を含みます。


-2

bashには次のエイリアスを使用するのが好きです。他の人が書いたことに基づいて、sedを使用して複数のスペースを検索し、単一のスペースに置き換えます。これにより、カットから一貫した結果を得ることができます。最後に、sedをもう一度実行して、スペースをタブに変更して読みやすくします。

alias ll='ls -lh | sed "s/ \+/ /g" | cut -f5,9 -d" " | sed "s/ /\t/g"'

これは質問にどのように答えますか?
トニン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.