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