Shell正则表达式匹配至行尾

4
我有一个类似于这个小例子的文件:
# ...
# mode=dev
# ...

在这个文件中,有一个在注释中的“变量”,我想用正则表达式在Shell脚本中获取它的值。

到目前为止我的代码:

#!/bin/bash
conf=$(<"/etc/test.conf") # Get the file content
regex='mode=(.*)$' # Set a regex
if [[ $conf =~ $regex ]]; then # Search for the regex in the file
    # We found it, so ...
    echo "${BASH_REMATCH[1]}" # ... here is the value
fi  

我面临的大问题是,它找不到这个值 :(
我尝试了很多不同的正则表达式,并使用https://regex101.com/ 进行测试,但似乎Shell正则表达式解释器与pcrepython不同。

我的最佳解决方案是找到mode=并获取后面的所有内容。所以有没有办法只获取值?开始很容易......查找mode=。但是如何告诉shell正则表达式获取mode=之后的所有内容直到下一个换行符,并且不要超出这个换行符?
使用\n(unix换行符)和$(字符串结尾)对我没有起作用:(

谢谢帮忙,
问候


尝试使用 mode=[^\n]+,其中 [^\n] 匹配任何不是换行符的字符。此外,在 [tag:Shell] 中是否需要设置修饰符? - SierraOscar
我已经尝试过这个了,但是当我这样做时,它会占用几行。也许有其他的换行符,而不是\n吗? - toddeTV
尝试使用 mode=[^\r\n] 替代,这样可以避免回车换行的问题。 - SierraOscar
1个回答

3
你可以使用这个正则表达式来获取匹配结果:
conf=$(<"/etc/test.conf")
regex=$'mode=([^\n]*)'
[[ $conf =~ $regex ]] && echo "${BASH_REMATCH[1]}"

输出:

dev

正则表达式 $'mode=([^\n]*)' 匹配字面文本 mode= 后面跟着 0 或多个不是 \n 的任何字符。


1
这个匹配字面字符n,表示0或多个不是n的任何字符。 - abc123
请确保使用Bash。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接