如何提取文本文件中位于特定分隔符间的邮箱地址并写入新文件
如何提取文本文件中位于特定分隔符间的邮箱地址并写入新文件
嘿,这个需求太常见了,用Linux/Unix下的经典文本处理工具就能快速搞定,我给你分享几个实用的方案:
方法1:用grep(最简洁的方式之一)
grep的正则匹配能力刚好适配这个场景,尤其是-o参数能只输出匹配到的内容,完美提取特定片段:
grep -oP '(?<=\=\>).*?(?=\<\=)' input.txt > output.txt
给你拆解下各部分的作用:
-o:只输出文本中匹配到的部分,而不是整行内容-P:启用Perl兼容的正则表达式(PCRE),支持正向预查语法(?<=\=\>):正向预查,确保匹配内容紧跟在=>之后.*?:非贪婪匹配任意字符,避免把多行的内容误匹配成一段(?=\<\=):正向预查,确保匹配内容在<=之前input.txt是你的源文件名,> output.txt会把提取到的邮箱直接写入新文件
方法2:用sed(流编辑器处理)
sed擅长文本替换,我们可以通过替换规则剔除不需要的内容,只保留邮箱:
sed -n 's/.*=>\([^<]*\)<=.*/\1/p' input.txt > output.txt
参数和规则说明:
-n:默认不输出任何行,只打印我们指定的内容s/.*=>\([^<]*\)<=.*/\1/:替换规则,把整行内容替换成目标邮箱.*=>:匹配行首到=>的所有冗余内容\([^<]*\):捕获<=之前的所有非<字符(邮箱里不会包含<,这个写法很安全)<.*:匹配<=到行尾的所有冗余内容\1:引用刚才捕获到的邮箱内容
p:打印替换后的有效结果
方法3:用awk(灵活的文本分析工具)
awk可以通过自定义分隔符拆分文本,轻松定位到目标片段:
awk -F'[=><=]' '$3 != "" {print $3}' input.txt > output.txt
解释下逻辑:
-F'[=><=]':把=、>、<设为分隔符,这样每行文本会被拆分成多个字段- 符合格式的行里,邮箱刚好是第3个字段(比如
323168fdsafdafsdfj=>email1@example.de<=...会被拆成323168fdsafdafsdfj、空字段、email1@example.de、空字段、askdjfköj4243j40278012) $3 != "":过滤掉没有邮箱的空行,只打印有效的邮箱内容
如果你的awk是GNU版本,还可以用正则匹配的方式:
awk 'match($0, /=>([^<]*)<=/, result) {print result[1]}' input.txt > output.txt
这里match函数会把捕获到的邮箱存入result数组,result[1]就是我们要提取的内容。
备注:内容来源于stack exchange,提问作者D-T
相关产品推荐
相关产品推荐

