我有一个文本文件,我想在新行上打印每个单词(多个字符)。如果一个单词由单个字符组成,则必须将其作为下一个单词的一部分进行处理,并与它一起打印在新行上。如果它位于两个单词之间,则它必须位于第二个单词之后。例子:
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 个字符的单词之前使用单词边界标记,但&
它不是单词字符,因此单词边界没有用。