使用 awk、sed、grep 在新行上打印一个单词多个章程

使用 awk、sed、grep 在新行上打印一个单词多个章程

我有一个文本文件,我想在新行上打印每个单词(多个字符)。如果一个单词由单个字符组成,则必须将其作为下一个单词的一部分进行处理,并与它一起打印在新行上。如果它位于两个单词之间,则它必须位于第二个单词之后。例子:

Unix & Linux Stack Exchange is a question and answer site for users of Linux,

输出

Unix
& Linux
Stack
Exchange
is 
a question 
and 
answer 
site
for
users
of
Linux

答案1

怎么样

sed -r 's/([^ ]{2,}) /\1\n/g' file
Unix
& Linux
Stack
Exchange
is
a question
and
answer
site
for
users
of
Linux,

检查空格前面是否有 2 个或更多非空格字符模式,并用“后向引用”模式加<LF>字符替换。

答案2

我会在这里使用 Perl 风格的正则表达式:

$ echo "$s" | grep -Po '((^|\s)\K\S\s+)?\S{2,}'
Unix
& Linux
Stack
Exchange
is
a question
and
answer
site
for
users
of
Linux,

您可以使用扩展正则表达式执行相同的操作,但由于它没有 PCRE 的环视,因此您最终会捕获前导空格:

$ echo "$s" | grep -Eo '((^|[[:blank:]])[^[:blank:]][[:blank:]]+)?[^[:blank:]]{2,}'
Unix
 & Linux
Stack
Exchange
is
 a question
and
answer
site
for
users
of
Linux,

我希望在 1 个字符的单词之前使用单词边界标记,但&它不是单词字符,因此单词边界没有用。

相关内容