从文件中提取文本并将该行输出到文件中

从文件中提取文本并将该行输出到文件中

在 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.txtNUMBER-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) 覆盖文件的内容(如果不存在则创建它)。

另一种方法是使用>>>文本附加到文件而不是覆盖它。

相关内容