GNU/Linux >> Linux の 問題 >  >> Linux

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

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


Linux
  1. スマートクォートをLinuxsedコマンドに置き換えます

  2. 文字列をSedのスラッシュを含む文字列に置き換える方法は?

  3. SedですべてのCコメントを削除しますか?

  1. 大きなファイルにSedとParallelを使用して、行を別のコンテンツに置き換えますか?

  2. 行の範囲を行の範囲(sedまたはその他)に置き換えますか?

  3. 最後を除くすべての改行をスペースに置き換えますか?

  1. grep と sed を使用して文字列を検索して置換する

  2. ディレクトリとサブディレクトリで検索して sed に置き換えます

  3. bashで単語を別の単語に置き換える