【问题标题】:Unix shell bash 'one-liner' to isolate all parentheses containing a URL that includes ".mp3"Unix shell bash 'one-liner' 以隔离所有包含包含“.mp3”的 URL 的括号
【发布时间】:2010-12-09 19:39:24
【问题描述】:

我对这个 Unix bash 的东西完全陌生——这里是第一个问题!希望大家帮忙:)

问题:

我有大量杂乱无章的网络源代码(包装/未格式化),其中包含多次出现:

('http://www.example.com/path/audio.mp3')

您能否提供一个单行 (sed/awk...) 来隔离这些出现的括号,其中包含包含“.mp3”的 URL,干净的前导/尾随“()" 和" ' " 字符,然后作为列表(每行一个)打印到活动的 .txt 文件中。

注意:单行将在 Mac 上的 Automator 中用作服务/工作流程以对“选定文本”进行操作。

任何帮助将不胜感激(尽管浏览了所有在线 tuts)我完全迷失了。

最好的问候,

戴夫

【问题讨论】:

  • 您是否曾经在每个源代码行列出多个 mp3?
  • 是的,在某些情况下(我认为)。虽然,由于它都是未格式化/包装的源,我真的不知道“行已定义......

标签: shell text-processing automator


【解决方案1】:

使用egrep-o(仅输出匹配的部分)应该可以解决问题。试试这样的:

egrep -o "http://[^'\"]+.mp3" FILENAME

【讨论】:

  • +1:简洁,直接回答问题。还可以在一行中正确捕获多个实例。
  • 如果括号和引号也匹配,但不输出会很好......这可能吗,用egrep?
  • @EOL:见my answer
【解决方案2】:

PERL,Mac 应该有的。

#!/usr/bin/perl
while(<STDIN>)
{
    $_ =~ /.*(http:\/\/.*\.mp3).*/;
    print $1 . '\n';
}

【讨论】:

  • 我在 Automator 中运行了脚本,但是得到了 "italian-flashcards.com/mp3-words-patrick/2239.mp3\n" ...而不是所有 url 链接的列表 ...
  • 嗯。您是否只得到一行,或者问题是最后的换行符?您的输入集中有多少条目?
  • 是的,我只拿回了最后加了“\n”的那个。应该得到一个包含 40 个 URL 的列表......
【解决方案3】:

尝试完善以下内容:

perl -ne $'while(/\(\'(http:\/\/[\w.\/]+?\.mp3)\'\)/g) { print "$1\n"; }' < input_file > output_file

它一次读取一行标准输入(此处:input_file),在该行中查找每个出现的“url”并将其打印到标准输出(此处:output_file),没有(' 和@987654325 @。

【讨论】:

  • 我在 Automator 中使用“usr/bin/perl”进行了尝试,但排除了“ output_file”,无法运行...有什么想法吗?
  • 出现错误 - 我错过了 /... 抱歉。这是一个证明概念:echo -e "cat\ndog('http://someserver/somefile.mp3')mouse\nbee" | perl -ne $'while(/\(\'(http:\/\/[\w.\/]+?\.mp3)\'\)/g) { print "$1\n"; }'
  • 错过的“/”在脚本中的哪个位置?
【解决方案4】:

awk '{print $2}' FS="('|')" &lt; filename

cat filename | tr ')' '\n' | awk '{print $2}' FS="('|')" &gt; output.txt

只需将 filename 替换为包含这些行的文件的名称..

echo "your multiline\
text here" | tr ')' '\n' | awk '{print $2}' FS="('|')"

试一试:

tr ')' '\n' | awk '{print $2}' FS="('|')"

【讨论】:

  • 这不会在一行中捕获多次出现。
  • 是的。更正以包含该内容。
  • 如果没有“filename”和“output.txt”,我将如何使用它?干杯
  • 您的意思是将输入文本作为参数发送,然后在同一个控制台上接收列表?
  • 我不确定这意味着什么。我在 Mac 上使用 Automator “/bin/bash” 中的单行,并选中了“替换选定的文本”。所以单行应该不需要任何“文件名”参数(如脚本中的“文件名”和“output.txt”),对吧?
【解决方案5】:

这将匹配出现在括号和单引号中的 URL:

grep -Po "(?<=\(')http.*?mp3(?='\))"

输出 URL,每行一个,不带括号或单引号。 Perl 兼容正则表达式的-P 选项(至少)在 GNU 和 OS X grep 版本中可用。

【讨论】:

  • 谢谢,丹尼斯。该脚本有效,但仅打印出 Web 源代码中包含的 40 个 url 中的 8 个。可能是您的脚本没有在一行中捕获多个 url 实例?
  • @dave:不,当我在一行和多行中使用多个 URL 对其进行测试时,如您的问题所示,它会输出所有这些 URL。你能告诉我一个它没有得到的例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2016-09-14
  • 2015-11-28
  • 2016-09-08
  • 1970-01-01
相关资源
最近更新 更多