我想要提取文件夹中所有 js 文件中代码语句中提到的所有 URL。例如,如果 js 文件包含以下代码:
var myURL="http://yahoo.com/signup"
//var myURL="http://yahoo.com/sign" --commented out
那么当我的脚本运行时,输出应该只是“http://yahoo.com/signup“。目前我正在使用 grep 来提取 URL。输出包含输出中的两个语句。我不希望输出中出现注释的 URL。
目前我正在使用基本的 grep 语句
cat somefile.js | grep "http[s]\?://"
所有 URL 都将是 http/https,并将在 js 文件中的语句中声明。
我想微调此 grep 语句以仅输出 URL(不包括注释的 URL)而不是完整的语句。我该如何微调此 grep 语句?
答案1
您的文件有多大/有多少个?
我对此类事情使用的一个非常简单的解决方案是 excel。您只需将文件(只要只有几个)复制/粘贴到 excel 中,然后对列进行排序。您应该在一个地方找到所有变量。将它们复制/粘贴到新工作表中,并在“”上拆分列。这应该会为您提供一个 URL 列。
当然,对于许多文件来说这并不实用——脚本会更好地发挥作用。
例子
我发现这对于手动解析 json 特别有用。下面是我通常如何使用它的一个例子。下面是来自 json 数组的片段:
{'english' => 'the animals, 'spanish' => 'los animales', 'image_url' => 'http://www.resourcesgraphics.com/images/Animals-Set-icons.jpg},
{'english' => 'the bear, 'spanish' => ' el oso , 'image_url' => 'http://images.nationalgeographic.com/wpf/media-live/photos/000/005/cache/grizzly-bear_566_600x450.jpg},
{'english' => 'the beaver, 'spanish' => 'el castor, 'image_url' => 'http://images.nationalgeographic.com/wpf/media-live/photos/000/004/cache/beaver_457_600x450.jpg},
etc... (I have ~2000 entries in this file.)
为了取出所有 URL,我只需将整个文件复制/粘贴到 Excel 中,然后使用“数据”>“文本到列”>“分隔符”。如果您按引文拆分,它会将 URL 提取到其自己的列中。
反之亦然。(我经常这样做。)如果你想制作上面的表格,你可以反向使用此过程。为了快速填充列,我只需像这样制作第一列:
{'*english*' => '*the animals*, '*spanish*' => '*los animales*', '*image_url*' => '*http://www.resourcesgraphics.com/images/Animals-Set-icons.jpg*},
(* = 列划分)
因此,现在我们有 column1 = "{'", column2 = "english", column3 = "' => '", 等等... 列 1、3、5 等等是填充数据,数据位于中间。然后我会填写所有数据,并复制填充数据。填写填充数据的快速方法是双击顶部填充单元格的右下角手柄。这应该会将数据复制到列的末尾。
制作完电子表格后,请保存它。稍后您可以再次使用它。当您需要数据时,只需复制所有内容并粘贴到文本编辑器中即可。
列中通常会遗留一些令人讨厌的标签,但可以通过简单的查找/替换将其删除。
希望这能有所帮助——如果您需要更多信息,请告诉我! - L
答案2
这是一个 PERL 解决方案:
perl -ne '/^[^\/\/]*"(http.+?)"/ && do{print "$1\n"}' somefile.js
解释:
perl -ne
:逐行循环遍历输入文件(-n)并运行命令行中给出的脚本(-e)/^[^\/\/]*"(http.+?)"/
:查找没有//
前第一个,并保存从到第一个的http
字符。括号内的模式将保存为。http
"
()
$1
&& do{print "$1\n"}
:如果行与正则表达式匹配,则打印捕获的模式(URL)。
注意事项:
这是一个非常简单的解决方案,假设每行只有一个 URL,并且全部URL 已引用。如果您需要更复杂的版本,请告诉我。