Bash 根据分隔符将变量拆分为 3 个变量?

Bash 根据分隔符将变量拆分为 3 个变量?

尝试使用以下模式拆分字符串 var:

TestString="Artical Title Here (ClassYear) [Author]"

我能够使用 cut 将标题放入 Var 中,如下所示:

    ATH="$(cut -d'(' -f1 <<<$TestString)"
    echo $ATH

但我找不到一种好方法来将包含括号的 (ClassYear) 放入另一个字符串变量中,并且与包含括号的 [Author] 相同,如何将这些字段和格式放入另外 2 个变量中?

答案1

bash参数扩展:

# remove matching suffix ` (*`    
ath="${TestString%% (*}"

# remove matching prefix `*) `
author="${TestString##*) }"

# remove matching prefix `*(`
classyear="${TestString##*(}"
# remove matching suffix ` [*` and add the missing `(`
classyear="(${classyear%% [*}"

答案2

要获取班级年份和作者,您可以使用 grep。此外,您可以使用参数扩展来获取标题:

ath=${TestString/(*)*}
year=$(grep -o '(.*)' <<<"$TestString")
auth=$(grep -o '\[.*\]' <<<"$TestString")

这假设标题将绝不里面有圆括号或方括号,年份将总是括在括号中,作者将总是括在括号内。

.是一个匹配“任何单个字符”的正则表达式标记,添加*告诉它匹配零到无限次。所以它应该与括号中的任何内容相匹配。如果您想缩小范围,并且您的班级年份将始终是您可以执行的数字,'([0-9]+)'这仍然是一个广泛的解决方案,可以通过更多有关输入的信息来进一步缩小范围。

括号必须转义,因为它们在正则表达式中创建一个字符类,而我们希望按字面匹配它们。

相关内容