这是我的第一篇文章,所以请承担与我。我有一个文件,看起来像这样:
<table name="content_analyzer" primary-key="id"> <type="global" /> </table> <table name="content_analyzer2" primary-key="id"> <type="global" /> </table> <table name="content_analyzer_items" primary-key="id"> <type="global" /> </table>
我需要提取“name =”之后的引号内的任何内容,即content_analyzer,content_analyzer2和content_analyzer_items。
我在Linux盒子上做这个,所以使用sed,perl,grep或bash的解决方案是好的。
谢谢!
解决方法
旧版本的答案:
我认为最简单的单行解决方案(没有编写完整的脚本)将是使用grep:
grep -no 'name="[^"]*"' file.html
在这行:
> n选项将打印与模式匹配的行。只是信息的原因,乍一看。删除如果你不想要它。
> o选项仅打印匹配的文本,而不打印整行。
> file.txt是文件的路径。
此外,如果您想要将结果保存到文件,您可以通过追加> results.txt:
grep -o 'name="[^"]*"' file.html > results.txt
这里的一个大问题是grep不支持环视(至少我不这么认为)。因此,结果将是:
name="content_analyzer" name="content_analyzer2" name="content_analyzer_items"
它需要一些清理。这很容易在你的文本编辑器中做一些find / replace …但这就是为什么它不是一个完整的解决方案。
我怎么会这样做
在Vim中:-)
第一步
删除任何不包含name =的行
:v/name=/d
:%s/^.*name="\([^"]*\)".*$/\1
邦,甚至不必走出文本编辑器。
更新
正如丹尼斯·威廉姆森在评论中所说,grep确实有使用-P选项的环境,根据手册将模式解释为一个Perl正则表达式。太棒了!
所以这里是明确的一线解决方案:
grep -Po 'name="\K.*?(?=")' file.txt