假设我有一个(可能非常大)文本文件,其中包含插入了空格的单词列表。例如,它可能看起来像这样:
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 工具(如, sed
or )去除所有这些空格,同时保留(并隔离)缩进的单词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
。