【问题标题】:How to split a file into words keeping punctuation, in bash?如何在bash中将文件拆分为保持标点符号的单词?
【发布时间】:2014-09-17 06:30:37
【问题描述】:

例如,我有一个普通文本的文件,例如:

"Word1 word2, word3; word4. Word5"

我想得到一个每行 1 个单词的文件,保持标点,并有序:

,
.
;
Word1
word2
word3
word4
Word5

到目前为止,我发现这与我需要的最接近:

#!/bin/sh


for word in $(cat "input_file.txt"):
        do echo $word >> output_file1.txt;

done


sort "output_file1.txt" >> "output_file2.txt"

这会产生这种输出:

Word1
word2, 
word3;
word4.
Word5

显然是用空格分隔的。 如何通过空格和标点字符分隔并保留它们?

P.S:文件输入文件中含有丰富的特殊字符,例如变音符号:

Kuͦn、zuͦ、buͤtten、güetter。

当应用grep -Eo '\w+|[^\w ]' file 时,它们被拆分,好像变音符号是一个分隔符:

gu
̈
etter

虽然在其他情况下这些字符不会影响拆分:

brüchen

【问题讨论】:

  • 两个问题:(1.) 当您说 'and ordered' 时,您的意思是按照遇到的顺序保持标点符号吗? (2.)可能使用的标点符号是什么?是. ,;吗?
  • 按字母顺序排列。可能的标点符号:. , () : ;
  • 知道了,如果不需要保留Word/punct 关联,已经给出的答案可以正常工作。

标签: bash split


【解决方案1】:

使用grep -Eo

grep -Eo '\w+|[^\w ]' file
Word1
word2
,
word3
;
word4
.
Word5

排序:

grep -Eo '\w+|[^\w ]' file | sort -f
,
.
;
Word1
word2
word3
word4
Word5

PS:你也可以使用grep而不使用-E

grep -o '[[:alnum:]]\+\|[[:punct:]]'

【讨论】:

  • 谢谢,效果很好!但是当一个字符是一个带有变音符号的字母时,有时它会将字母放在一行,然后将标记放在后面,例如Kuͦn -> Kuͦ n
  • 啊,但我不知道您的文件中还有非 ASCII 字母。如果是这种情况,那么我想您需要提供更多示例。
  • 您可能需要打开一个新问题来处理非 ASCII 字符。我认为:grep -Po '[\p{L}\d]+|[^\d\p{L} ]' file 可以与正确的 LOCALE 等一起使用。
  • 我已经验证了上面的grep 可以使用正确的UTF-8 编码数据。您只需要确保您的输入使用的是UTF-8
  • 谢谢 :) 我几乎设法通过用我从 utf8 字符表复制的那些替换“坏”ü ö ä 来解决这个问题。至于 uͦ 和 uͤ 这样的字符,它们既不在 utf8 也不在 ascii 表中,所以我想我不能用任何兼容的东西替换它们。我将创建一个关于它的新问题。
猜你喜欢
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2010-09-26
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多