在 Linux 中用单个新行替换任意数量的制表符和空格?

use*_*489 7 sed awk whitespace tr text-formatting

假设我有一个(可能非常大)文本文件,其中包含一个插入空格的单词列表。例如,它可能如下所示:

Cat                           Dog
Soup                          Rat
Cass                          Audrey
Run Code Online (Sandbox Code Playgroud)

我希望每个单词都在一个单独的行上(没有空格),如下所示:

Cat
Dog
Soup
Rat
Cass
Audrey
Run Code Online (Sandbox Code Playgroud)

我可以做一个简单tr -d " "的把它变成:

CatDog
SoupRat
CassAudrey
Run Code Online (Sandbox Code Playgroud)

(但这不是我想要的)。

我不知道用什么类型的空格来分隔这些单词,因此假设它是普通 ASCII 空格和制表符的某种组合。(我们可以假设没有不可见的 Unicode 字符,比如空格和零宽度的东西。)?自然,这些词不包含空格,所以?“à la”、“alma mater”、“apple pie”、“at large”和“ice cream”不是有效词。

假设单词可能包含(非空白)非字母字符,例如“AC/DC”、“add-on”、“AT&T”、“audio-visual”、“can't”、“carbon-14” 、“jack-o'-lantern”、“岳母”、“o'clock”、“O'Reilly”、“RS-232”和“3-D”。理想情况下,解决方案应该容忍非 ASCII 字符,如“Ångström”、“Gödel”、“naïve”、“resume”和“smörgåsbord”。

如何使用常见的 Unix/Linux 工具(如trsed或)在保留(和隔离)缩进单词的同时去除所有这些空格awk

如果该解决方案也适用于所述问题的更一般情况,那就太好了;即,不仅是两列文本,还有随机排列,例如:

Cat                           Dog
Soup                          Rat
Cass                          Audrey
Run Code Online (Sandbox Code Playgroud)

G-M*_*ca' 13

etopylight 几乎是对的:

tr -s ' \t' '\n'
Run Code Online (Sandbox Code Playgroud)

因为这个问题也要求替换标签。

  • POSIX 等效项是 `tr -s ' \t' '[\n*]'`。另请参见 `tr -s '[:space:]' '[\n*]'` 或 `tr -s '[:blank:]' '[\n*]'` (2认同)

the*_*rpy 10

基本上,你可以在 GNU 中做到sed

sed 's/\s\+/\n/g'
Run Code Online (Sandbox Code Playgroud)

你去...


Ulr*_*arz 6

你应该可以使用

sed -e 's/[[:space:]]\{1,\}/\n/'
Run Code Online (Sandbox Code Playgroud)

用单个换行符替换一个或多个空白字符的任何序列(包括换页符和垂直制表符等奇怪的字符)。

  • 几乎是可移植的,但大多数 `sed` 版本会插入一个反斜杠和一个 `n`,因为替换中的 `\n` 没有被标准定义。改用文字换行符(通常通过键入反斜杠、Ctrl-V、Ctrl-J)。 (6认同)