我发现有很多解决方案可以做我想要的只有一个例外。
我需要搜索.html文档并拉一个字符串。
包含字符串的行将如下所示(1行,无换行符)
<script type="text/javascript">g_initHeader(0);LiveSearch.attach(ge('oh2345v5ks'));var _ = g_items;_[60]={icon:'INV_Chest_Leather_09',name_enus:'Layered Tunic'};_[6076]={icon:'INV_Pants_11',name_enus:'Tapered Pants'};_[3070]={icon:'INV_Misc_Cape_01',name_enus:'Ensign Cloak'};</script>
我需要的文字是
INV_CHEST_LEATHER_09
当我使用awk,grep和sed时,我在icon:'和',name _
之间提取数据问题是,所有这三个脚本扫描整行并使用最后一个',name_因此我最终
INV_Chest_Leather_09' ,name_enus:“分层 外套 '}; _ [6076] = {图标:' INV_Pants_11' ,name_enus:'圆锥 裤 '}; _ [3070] = {图标:' INV_Misc_Cape_01
这是我试过的最后一个
grep -Po -m 1“(?&lt; =] = {icon:')。*(?=',name _)”
我也试过awk和sed,我真的不喜欢使用哪一个。
所以基本上,我需要搜索整个html文件,找到第一个出现的icon:',在它之后提取文本,直到第一次出现在icon:'of',name _之后。
答案 0 :(得分:1)
使用GNU awk为第3个arg匹配():
$ awk 'match($0,/icon:\047([^\047]+)/,a){print a[1]}' file
INV_Chest_Leather_09
答案 1 :(得分:0)
正则表达式中的。*是一个贪婪的匹配器,因此模式将匹配到字符串的结尾,然后回溯以匹配name_部分。您可以尝试用[^,] *替换。*(即匹配除逗号之外的任何):
grep -Po -m 1 "(?<=]={icon:')[^,]*(?=',name_)"
答案 2 :(得分:0)
无论如何,我都需要使用sed删除正在生成的空行,所以这是我的最终代码,它将完全按照我想要的结果进行。
cat "index.html" | grep -Po -m1 "(?<=BEGIN)[^,]*(?<=END)" | sed '/^$/d' | head -1
答案 3 :(得分:0)
简单的 perl 方法:
perl -ne 'print "$1\n" if /\bicon:\047([^\047]+)/' file
输出:
INV_Chest_Leather_09