在 html 文件上使用 grep 后,我得到以下输出:
<div id="v3060000-3062005" class="BLAH...>
<div id="v50001027-50002018" class="BLAH...>
<div id="v907200-907202" class="BLAH...>
<div id="v20024011-20024012" class="BLAH...>
我需要从上面的行中提取数字字符串并将它们组合成一个 URL,例如:
http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3
我可以知道如何使用 shell 脚本来做到这一点吗?
答案1
通常,我建议您使用适当的 HTML 解析器来解析 HTML。
但是,这些数据看起来非常简单:使用双引号(后面可以跟“v”)作为字段分隔符,抓取每行的第二个字段。然后用逗号连接各部分
result=$( grep ... file.html | awk -F'"v?' '{print $2}' | paste -sd, )
echo "http://x.y.z/$result.mp3"
答案2
假设您将问题的输入数据存储在名为的文件中data.txt
,则可以使用此命令生成 URL:
grep -Po '\d+-\d+' data.txt | tr '\n' ',' | sed -r 's/(.*),$/http:\/\/x.y.z\/\1.mp3/'
以下是一个运行示例:
$ grep -Po '\d+-\d+' data.txt | tr '\n' ',' | sed -r 's/(.*),$/http:\/\/x.y.z\/\1.mp3/'
http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3
它能做什么:
grep -Po '\d+-\d+' data.txt
NUMBER-NUMBER
从您的数据中提取所有序列,3060000-3062005
并每行输出一个序列。tr '\n' ','
将输入的所有换行符转换为逗号,有效地将各行连接在一起。sed -r 's/(.*),$/http:\/\/x.y.z\/\1.mp3/'
从输入中删除尾随的逗号并将其嵌入到字符串中http://x.y.z/\1.mp3
,替换\1
。请注意,字符串中的所有斜杠都必须用反斜杠转义。
答案3
和awk
:
... | awk -F'"' '{part=part substr($2,2) ","} \
END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"}'
-F'"'
将字段分隔符设置为"
part=part substr($2,2) ","}
获取第二个字段,并从字符串中substr($2,2)
删除开头v
,并将结果添加,
为尾随变量进行保存part
END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"}
,
在解析所有记录后运行块,这里我们从变量中剥离最后一个part
,并打印所需的格式化输出
例子:
% cat file.txt
<div id="v3060000-3062005" class="BLAH...>
<div id="v50001027-50002018" class="BLAH...>
<div id="v907200-907202" class="BLAH...>
<div id="v20024011-20024012" class="BLAH...>
% awk -F'"' '{part=part substr($2,2) ","} END {sub(",$", "", part); print "http://x.y.z/" part ".mp3"}' file.txt
http://x.y.z/3060000-3062005,50001027-50002018,907200-907202,20024011-20024012.mp3
答案4
首先,您需要弄清楚如何获取需要输出的文本。由于其他答案显示了如何执行此操作,因此我不需要在我的答案中包含该信息。
但是,我将讨论如何将该信息输出到文件中。
为此,请> filename
在命令后插入。这将使用所用命令的标准输出 (stdout) 覆盖文件的内容(如果不存在则创建它)。
另一种方法是使用>>
将>
文本附加到文件而不是覆盖它。