![Bash 根据分隔符将变量拆分为 3 个变量?](https://linux22.com/image/154205/Bash%20%E6%A0%B9%E6%8D%AE%E5%88%86%E9%9A%94%E7%AC%A6%E5%B0%86%E5%8F%98%E9%87%8F%E6%8B%86%E5%88%86%E4%B8%BA%203%20%E4%B8%AA%E5%8F%98%E9%87%8F%EF%BC%9F.png)
尝试使用以下模式拆分字符串 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]+)'
这仍然是一个广泛的解决方案,可以通过更多有关输入的信息来进一步缩小范围。
括号必须转义,因为它们在正则表达式中创建一个字符类,而我们希望按字面匹配它们。