0

我必须从两种类型的列表中提取一个特殊的 URL。

wav_list_01.txt:

http://www.example.com/3277rdsh6721vs2981fg66_453.wav?ID=8572145"
http://www.example.com/3277rdsh6721vs2981fg66_1234.wav?ID=8572145"
http://www.example.com/3277rdsh6721vs2981fg66_89.wav?ID=8572145"
http://www.example.com/3277rdsh6721vs2981fg66_356.wav?ID=8572145"

在这种类型的列表中,正确的 URL 始终是下划线后有 4 位数字的 URL:

http://www.example.com/3277rdsh6721vs2981fg66_1234.wav?ID=8572145"

我可以使用以下 grep 命令完成此操作:

grep -o 'http[^"]*_[0-9]\{4\}.wav?ID=[0-9]\{1,\}' wav_list_01.txt

现在来解决问题。我还必须从另一种类型的列表中提取一个特殊的 URL。

wav_list_02.txt:

http://www.example.com/83d72jd72bnx27887f2s34_9.wav?ID=0942145"
http://www.example.com/83d72jd72bnx27887f2s34.wav?ID=0942145"
http://www.example.com/83d72jd72bnx27887f2s34_5.wav?ID=0942145"

在这种类型的列表中,正确的 URL 始终是没有下划线和单个数字的 URL:

http://www.example.com/83d72jd72bnx27887f2s34.wav?ID=0942145"

有什么方法可以修改上述 grep 命令以与 wav_list_02.txt 一起使用?如果不是,在同一脚本中处理两个列表的下一个最佳解决方案是什么?

该脚本将在 dash shell 中运行,因此该解决方案需要符合 POSIX,最好也是干净和简单的。

提前致谢。

解决方案:

在 Thalmann 的帮助下,找到了解决方案:

grep -o 'http[^"]*_[0-9]\{4\}.wav?ID=[0-9]\{1,\}\|\|http[^_]*?ID=[0-9]\{1,\}'
4

1 回答 1

0

您可以只使用 not 运算符 '^' 并说它可以是所有内容,但不能是下划线 - 如果匹配你有你的 URL - 它类似于 '[^_]*' 所有不是下划线的东西。

在 grep 命令上方使用“或”运算符插入它,它会同时使用四位数字的文件,如果它们不包含下划线。记得像这样转义 or 运算符:'\|'

于 2013-03-27T17:15:07.600 回答