正则表达式的bash语法

问题描述 投票:1回答:2

我无法在我的bash脚本中将我的测试正则表达式应用于分组。在变量中使用分组应用正则表达式的正确bash语法是什么?

我用正则表达式测试器测试了我的正则表达式并且工作了。但是我仍然无法用bash来解决这个问题。现在我或多或少了解正则表达式如何工作,但我仍然需要知道这在脚本中是如何应用的。

read_line="1- https://www.youtube.com/watch?time_continue=4&v=wgG6xlQ1jx8  ==> movie name 1"
url=[[ "$read_line" =~ \d.*?(https.*?)==]] && echo "${BASH_REMATCH[1]}" #This syntax I copied from here. 

folder_name=[[ "$read_line" =~ ==>\s+(\w+.*) ]] && echo "${BASH_REMATCH[1]}"

实际结果应该是:

url : https://www.youtube.com/watch?time_continue=4&v=wgG6xlQ1jx8
folder_name: movie name 1
bash syntax
2个回答
1
投票

尝试:

$ [[ "$read_line" =~ [0-9].*(https.*)== ]] && echo "${BASH_REMATCH[1]}"
https://www.youtube.com/watch?time_continue=4&v=wgG6xlQ1jx8  

$ [[ "$read_line" =~ '==>'[[:space:]]+([[:alnum:]].*) ]] && echo "${BASH_REMATCH[1]}"
movie name 1

Comments

  1. Bash不支持\d\w等字符类。 Bash使用POSIX正则表达式。
  2. [[ ... ]]设置错误代码但不返回字符串。因此,诸如var=[[ ... ]]之类的变量赋值是没有用的。
  3. 当使用[[]]时,空间很重要。注意这失败了: $ [[ 1=1]] && echo yes bash: conditional binary operator expected bash: syntax error near `yes' 但这成功了: $ [[ 1 = 1 ]] && echo yes yes
  4. Bash(POSIX)正则表达式始终匹配最长匹配。他们不支持非贪婪的比赛,如.*?

Assigning values and catching missing matches

if [[ "$read_line" =~ '==>'[[:space:]]+([[:alnum:]].*) ]]
then
    folder_name="${BASH_REMATCH[1]}"
else
    echo "No Match"
fi

0
投票

原始的bash代码,

url = [[“$ read_line”=〜\ d。?(https.?)==]] && echo“$ {BASH_REMATCH [1]}”

folder_name = [[“$ read_line”=〜==> \ s +(\ w +。*)]] && echo“$ {BASH_REMATCH [1]}

包含bash正则表达式的错误; - [[ ]]正则表达式并不意味着RHS或表达中的正确值,所以它会出错 - 它没有速记功能;由bash正则表达式支持的\w, \d, \s等必须执行[A-Za-z_],[0-9],[]等但是...... - 幸运的是它支持POSIX类集\w by [[:alnum:]] \d by [[:digit:]] \s by [[:space:]]等,请参阅其手册 - 它没有'懒惰'量词特征?跟随重复运算符*+ - 里面的正则表达式占位符[[ ]],一些bash特殊字符仍然适用于此类 \ > |必须作为\\ \> \|和关系运营商== <=等逃脱

建议: 获取/安装更好的正则表达式引擎即。更好的编程语言,内置更好的正则表达式功能来完成这些工作。从qazxsw poi等内部做到

为了获得目标,bash脚本可能是;

sed, perl, awk
© www.soinside.com 2019 - 2024. All rights reserved.