我正在尝试从输入字符串中获取文件扩展名,以确定它们是哪种文件。
我在网上找到了许多解决方案,而且我发现其中一种特别有效。将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应该只给我每个文件的文件扩展名,而没有其他内容。
答案 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对其进行测试,并找到更详细的说明。