如何在Bash中提取多个唯一子字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Bash中提取多个唯一子字符串相关的知识,希望对你有一定的参考价值。

摘要:我有一个子字符串提取问题,我刚刚失败了。我有一个字符串,该字符串包含我要提取的人的名字的不确定的多个名称。在字符串中,这些子字符串定义得相当好,但是子字符串的随机数量,子字符串的随机长度以及我的中级Bash技能使我不知所措。

Context:我已使用exiftool从DigiKam处理的文件中提取选中的标签,以生成我的源字符串。我认为这个事实对眼前的问题并不重要,但可以保证完整性。

字符串示例

tagoutput="Tags List                       : Date/Month/March, Places/Our House, People/FirstName1 LastName1, People/FirstName2 LastName2, Date/Year/2009, Date/Day/22"
tagoutput="Tags List                       : People/FirstName1 LastName1, Date/Year/1970, Date/Month/Feburary, Places/Grandmas House"

注意:如您所见,在字符串中,事物的格式正确,但可能以随机顺序出现并且数量未知。在上面的每个示例中,List和冒号之间还有一个供参考的FYI,其中有一个很大的空格(〜25个空格),此处张贴的内容会自动删除。

我需要:给定$tagoutput,我想向控制台回显

FirstName1 LastName1
FirstName2 LastName2
...

对于$tagoutput中的每个名称。我在“对于目录循环中的每个文件”中拥有此文件,在该文件中,我在细化名称的$tagoutput前立即提取了$tagoutput。由于此问题是以文件为中心的,因此我选择使用Bash,但是如果此处的正确答案是使用更适合的语言(如Python),则我不愿意这样做。

答案

使用GNU grep,您可以做:

grep -Po ' People/\K[^,]*' <<< $tagoutput

此匹配每次出现的People/(以空格开头),并在其后提取零个或多个非逗号字符。

以上是关于如何在Bash中提取多个唯一子字符串的主要内容,如果未能解决你的问题,请参考以下文章

在普通bash中使用正则表达式提取子字符串

在 Bash 中提取子字符串

从单个按钮从多个片段中提取数据

如何在R中使用for循环提取多个子字符串

有没有办法在bash中的特定子字符串之后提取子字符串?

带有正则表达式的 Bash 子字符串