如何从文件中解析出单词?

如何从文件中解析出单词?

假设我有一个像这样的文件

<jack,
john.
................
,joe
..........Jen..
>Tom
Edwa4rd
4Tim
Richard

我如何将其变成一个干净的列表,例如

jack
John
joe
Jen
Tom
Tim
Richard

请注意,Edward 不在列表中

使用 Linux 命令?可能是 grep 和/或 sed

答案1

尝试egrep -o '[A-Za-z](.*[A-Za-z])?' < infile | egrep -o '[A-Za-z]+' > outfile一下你的例子。

第一部分挑选出类似名称的东西(必须以字母开头并以字母结尾,但可能包含任何内容),然后第二部分egrep将我们过滤为全字母的名称。

看看这个,我已经看到了几种创建输入的方法,这些输入会导致这些表达式失败并且不完全匹配正确的内容(嗯,这将与写入的内容匹配,但是你留下了歧义 - 应该如何..Richard..<Tim?..处理?),但根据输入数据很容易将它们组合在一起 - shell脚本通常不是关于所有可能输入的100%数学正确性,而是了解你的输入域并使用表达式和命令来完成工作,这些表达式和命令对于你必须处理的输入来说足够好。

答案2

正则表达式^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$应该可以工作。

  1. ^匹配行首
  2. [^a-zA-Z]*匹配零次或多次非字母
  3. [a-zA-Z]+匹配一个或多个字母
  4. [^a-zA-Z]*匹配零次或多次非字母
  5. $匹配行尾

因此,它将忽略行中的前导和后续非字母,并且仅当第一个字母和最后一个字母之间没有非字母时才匹配。

括号表示捕获组,也就是我们要提取并打印的部分。我最初是为 .NET 编写并测试的,但这里有一个sed命令。不要问我它是如何sed工作的,我不知道。

sed -rn 's/^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$/\1/p' inputfile

您可以直接写入输出文件,而不必打印:

sed -rn 's/^[^a-zA-Z]*([a-zA-Z]+)[^a-zA-Z]*$/\1/w outputfile' inputfile

答案3

用来grep -o '[[:alpha:]]\+'提取出所有的“单词”。

jack
john
joe
Jen
Tom
Edwa
rd
Tim
Richard

然后由您来确定哪些是名称,哪些只是字母序列。

相关内容