Linuxでは、複数のタブとスペースを1つの新しい行に置き換えますか?

Linuxでは、複数のタブとスペースを1つの新しい行に置き換えますか?

スペースが挿入された単語のリストを含む(潜在的に非常に大きい)テキストファイルがあるとしましょう。たとえば、次のようになります。

Cat                           Dog
Soup                          Rat
Cass                          Audrey

次のように、各単語をスペースなしで別々の行に表示したいと思います。

Cat
Dog
Soup
Rat
Cass
Audrey

簡単にtr -d " "次のように変更できます。

CatDog
SoupRat
CassAudrey

(しかしそれは私が望むものではありません。)

どのタイプのスペースがこの単語を区別するのかわからないため、通常のASCIIスペースとタブの組み合わせであるとします。 (全幅スペースやゼロ幅などの見えないUnicode文字はないと仮定できます。)当然、これらの単語は存在しません。含む空白なので、「à la」、「alma mater」、「appleie」、「at free」、「icecream」は有効な単語ではありません。

単語に「AC/DC」、「add-on」、「AT&T」、「audio-video」、「can't」、「carbon-14」などのアルファベット以外の文字(スペースではない)を含めることができる仮定します。 , "jack-o'-lantern" ", "義母", "o'clock", "O'Reilly", "RS-232", "3-D". 理想的には、ソリューションは "Ångström", "Gödel" 、「naïve」、「résumé」、「smörgåsbord」などの非ASCII文字を許可する必要があります。

trsedなどの一般的なUnix / Linuxツールを使用したり、インデントされた単語を保持(および分離)しながらこれらのスペースをすべて削除するにはどうすればよいですかawk

この解決策が言及されている問題のより一般的な場合でも効果がある場合は良いでしょう。つまり、2つのテキスト列だけでなく、次のランダムな配列にも適用されます。

          Once    upon
    a   midnight
                    dreary
while                     I pondered
       weak    and weary
           Over                many
a   quaint  and     curious     volume
 of forgotten lore

答え1

etopylightはほぼ正しいです。

tr -s ' \t' '\n'

質問では、タブの交換も要求するからです。

答え2

デフォルトでは、GNUはこれを行うことができますsed

sed 's/\s\+/\n/g'

それではそうします...

答え3

あなたは利用可能でなければなりません

sed -e 's/[[:space:]]\{1,\}/\n/'

1つ以上の空白文字(フォームフィードや垂直タブなどの奇数文字を含む)のシーケンスを単一の改行文字に置き換えます。

答え4

awkのデフォルトの動作はすでに空白(空白、タブ)の数に関係なく分割することなので、その機能も使用できます。出力フィールドの区切り文字を「\ n」に設定して$ 0を再構築するだけです。しかし、このタスクの一般的な質問の1つは、空行をどのように処理しますか?

そのまま印刷してください。

awk -v OFS='\n' '{$1 = $1; print}' file

空白行をさらにフィルタリングするには:

awk -v OFS='\n' 'NF {$1 = $1; print}' file

(しかし、Linuxの設定では、Windows行の末尾(\ rを含む)に注意してください。awkは必ず\ rのある行を空行として扱わず、この場合は空行も出力されます。してくださいdos2unix

関連情報