web-dev-qa-db-ja.com

sedすべてのタブとスペースを1つのスペースに置き換える

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

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

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

私は以下を試しました:

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

さまざまなバリエーションがありますが、機能しませんでした。何か案は?

26
Zulakis

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の正規表現エンジンでは+は通常の文字であるのに対し、+は「1つ以上」のメタ文字であるため、\+は正規表現でエスケープする必要があります。 Mastering Regular Expressionsの86ページで、Jeffrey Friedlは脚注でedとgrepがエスケープされた括弧を使用していると述べています。括弧は後方参照よりも一般的です。」私は彼がプラス記号について同じように感じたので、それをメタキャラクターとして使用するにはそれをエスケープする必要があると思います。これでつまずくのは簡単です。

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

44
Starfish

-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:]文字クラスは、スペースとタブの両方で構成されています。

6
Benjamin W.