假设我有一个像这样的文件
<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]*$
应该可以工作。
^
匹配行首[^a-zA-Z]*
匹配零次或多次非字母[a-zA-Z]+
匹配一个或多个字母[^a-zA-Z]*
匹配零次或多次非字母$
匹配行尾
因此,它将忽略行中的前导和后续非字母,并且仅当第一个字母和最后一个字母之间没有非字母时才匹配。
括号表示捕获组,也就是我们要提取并打印的部分。我最初是为 .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
然后由您来确定哪些是名称,哪些只是字母序列。