Bash 基于同一规则从字符串中提取多个子字符串

Bash 基于同一规则从字符串中提取多个子字符串,bash,Bash,我试图从输入字符串中获取文件扩展名,以确定它们是什么类型的文件 我在网上找到了很多解决方案,特别是找到了一个几乎完美的解决方案。使用grep和perl正则表达式,我能够过滤掉所有不需要的位,得到一个字符串,由空格分隔的文件扩展名组成 grep -oP '(?<=\.).*?(?=")' 当输入以下一组文件时(请原谅长字符串,但这就是输入到grep的内容,要点是某些文件名的末尾包含省略号,这会破坏我的grep逻辑): 虽然我得到了所有需要的扩展名,但如果文件名恰好包含这些扩展名,我也会得到

我试图从输入字符串中获取文件扩展名,以确定它们是什么类型的文件

我在网上找到了很多解决方案,特别是找到了一个几乎完美的解决方案。使用grep和perl正则表达式,我能够过滤掉所有不需要的位,得到一个字符串,由空格分隔的文件扩展名组成

grep -oP '(?<=\.).*?(?=")'
当输入以下一组文件时(请原谅长字符串,但这就是输入到grep的内容,要点是某些文件名的末尾包含省略号,这会破坏我的grep逻辑):


虽然我得到了所有需要的扩展名,但如果文件名恰好包含这些扩展名,我也会得到一堆不需要的点。我认识到我必须使用grep的重复特性,即{1},但我一生都不知道我必须把它放在哪里才能工作。生成的正则表达式应该只给我每个文件的文件扩展名,别的什么都不给。

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
在整个输入中重复。

如果您想继续使用grep和PCRE
(?!\)[\w]+(?=”)
它使用一个负前瞻,这意味着它只在不后跟另一个模式的情况下匹配一个模式。在这种情况下,它匹配模式
[\w]
仅当后面没有点时。您可以对其进行测试,还可以找到更详细的解释

"Гарик Сукачёв и Неприкасаемые - 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"
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