web-dev-qa-db-ja.com

sedを使用してbashの空白を削除する

大量のファイルの各行に番号とそれに続くファイルパスを含むファイルがあります。したがって、次のようになります。

      7653 /home/usr123/file123456

しかし、これの問題は、その前に6つの空白スペースがあり、残りのスクリプトが破棄されることです。以下にそれを生成する行を含めました:

cat temp | uniq -c | sed 's/  */ /g' > temp2

不要な空白を生成するuniqコマンドになるように絞り込みました。空白を削除するためにsedコマンドを実装しようとしましたが、何らかの理由で1つを除いてすべて削除されます。 sedステートメントまたはuniqステートメントを変更して、これらの空白を削除するにはどうすればよいですか?どんな助けでも大歓迎です!

11
Sal

先頭の空白をすべて削除するには、次を使用します。

sed 's/^ *//g'

あらゆる種類のすべての先行空白を削除するには:

sed 's/^[[:space:]]*//g'

^記号は、行の先頭でのみ一致します。このため、上記では行の先頭にない空白はそのままにします。

10
John1024

現在のsedパターン 's/*// g'の内訳:検索パターン '*'は、単一のスペースに一致し、その後に0個以上のスペースが続きます。置換パターン ''は単一のスペースです。その結果、1つ以上のスペースのセットが見つかり、1つのスペースに置き換えられます。したがって、1つを除いてすべてのスペースが削除されます。すべて削除するには、置換パターンを空の文字列にするだけです '':sed 's/* // g'

ただし、「g」はグローバルにするため、数値とファイルパスの間のスペースも削除されることに注意してください。先頭のスペースを削除するだけの場合は、gをドロップするだけです。 「少なくとも0」を意味する*の代わりに、「少なくとも1つ」を意味する+数量詞を使用することもできます。それはあなたに残ります:sed 's/\ + /'

ETA:John1024が指摘するように、^アンカーを使用して行の先頭を指定し、\ sワイルドカードを使用してスペースだけでなく空白文字を指定することもできます:sed 's/\ s\+ //'

0
eewallace