【问题标题】:Shell regex to end of line外壳正则表达式到行尾
【发布时间】:2015-10-05 15:43:25
【问题描述】:

我有一个像这样的小例子的文件:

# ...
# 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= 和它之后的everything。那么有没有办法只获得价值?开始很容易......找到mode=。但是我如何说 shell 正则表达式来获得 mode= 直到 下一个换行符后面的所有内容?并且不超过这个换行符?
\n (unix linebreak) 和 $ (end of string) 对我不起作用:(

感谢您的帮助,
问候

【问题讨论】:

  • 尝试mode=[^\n]+,其中[^\n] 匹配不是新行的任何内容。另外,你必须在shell 中设置修饰符吗?
  • 我已经试过了,当我这样做时,他会写几行。然后\n可能还有另一个换行符吗?
  • 可能是回车。试试mode=[^\r\n]

标签: regex shell


【解决方案1】:

你可以使用这个正则表达式来获得你的匹配:

conf=$(<"/etc/test.conf")
regex=$'mode=([^\n]*)'
[[ $conf =~ $regex ]] && echo "${BASH_REMATCH[1]}"

输出:

dev

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

【讨论】:

  • 这匹配文字字符n,意思是0个或多个不是n的任何字符
  • 确保使用 bash
猜你喜欢
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2012-12-17
  • 1970-01-01
  • 2016-08-25
  • 2020-02-14
相关资源
最近更新 更多