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

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

假设我有一个(可能非常大)文本文件,其中包含插入了空格的单词列表。例如,它可能看起来像这样:

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” 、“南瓜灯”、“婆婆”、“o'clock”、“O'Reilly”、“RS-232”和“3-D”。理想情况下,解决方案应容忍非 ASCII 字符,如“Ångström”、“Gödel”、“naïve”、“résumé”和“smörgåsbord”。

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

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

          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/'

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

答案4

由于 awk 的默认行为已经是分割任意数量的空格(空格、制表符),因此也可以使用该功能,只需将输出字段分隔符设置为“\n”并重建 $0。然而,该任务的一个悬而未决的问题是:您希望如何处理空行?

按原样打印它们:

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

要另外过滤掉空行:

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

(不过,在 Linux 设置中要注意 Windows 行尾(包含 \r):awk 不一定将带有 \r 的行视为空行,在这种情况下也会输出它们。因此,首先过滤带有 CRLF 结尾的文本文件dos2unix

相关内容