根据相同的规则从字符串中提取多个子字符串

时间:2019-05-06 12:51:24

标签: bash

我正在尝试从输入字符串中获取文件扩展名,以确定它们是哪种文件。

我在网上找到了许多解决方案,而且我发现其中一种特别有效。将grep与perl正则表达式结合使用,我能够过滤掉所有不需要的位,并得到一个字符串,该字符串由以空格分隔的文件扩展名组成。

grep -oP '(?<=\.).*?(?=")'

是我现在拥有的,它产生的输出是

jpg jpg jpg jpg jpg jpg flac flac flac ...flac flac flac flac flac flac flac ...flac flac flac flac flac cue log m3u

当馈入以下文件集时(请注意长字符串,但这就是馈给grep的内容,其要点是某些文件名末尾包含省略号,这使我的grep逻辑不成立):

"Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/images/booklet2-3.jpg" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/images/booklet4.jpg" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/images/cd.jpg" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/images/cover.jpg" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/images/inlay.jpg" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/images/matrix.jpg" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/01 Моя бабушка курит трубку.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/02 Свободу Анджеле Дэвис!.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/03 За окошком месяц май.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/04 Знаю я, есть края....flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/05 Ольга.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/06 Я милого узнаю по походке.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/07 Белый колпак.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/08 Прощай, мой друг.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/09 Дорожная.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/10 10 000 километров.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/11 Брёл, брёл, брёл....flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/12 Напои меня водой.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/13 Города, где дымится асфальт.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/14 Песня вольного стрелка (Белла Чао!).flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/15 Нулевой километр.flac" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/Grand Сollection.cue" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/Гарик Сукачёв и ''Неприкасаемые'' - Grand Сollection.log" "Гарик Сукачёв и Неприкасаемые - Grand Collection (2002)/Гарик Сукачёв и ''Неприкасаемые'' - Grand Сollection.m3u"

虽然我确实获得了所有需要的扩展名,但是如果文件名恰好包含了这些扩展名,我也会得到很多不需要的点。我认识到我必须使用grep的重复功能,即{1},但是我无法终生弄清楚必须将其放置在哪里才能使其正常工作。生成的regex应该只给我每个文件的文件扩展名,而没有其他内容。

2 个答案:

答案 0 :(得分:0)

sed将为您做到这一点。

sed -E ' s/"[^"]+[.]+([^"]+)"/\1/g' data
jpg jpg jpg jpg jpg jpg flac flac flac flac flac flac flac flac flac flac flac flac flac flac flac cue log m3u

"的报价
[^"]+后跟一个或多个非引号
[.]+后跟一个或多个点
([^"]+)后跟一个或多个我们记得的非引号
"后加引号,

\1替换为我们在每个序列中记住的部分,
g在输入中重复。

答案 1 :(得分:0)

如果您想继续使用grep和PCRE (?!\.)[\w]+(?="),则可以尝试使用此正则表达式。它使用负数超前查询,这意味着仅在不跟随其他模式的情况下,它才与该模式匹配。在这种情况下,仅当模式[\w]不带点后才匹配。您可以here对其进行测试,并找到更详细的说明。