正则表达式的bash语法

时间:2019-04-20 20:01:23

标签: bash syntax

我无法在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

2 个答案:

答案 0 :(得分:1)

尝试:

@media (max-width: 767.98px) and (orientation: landscape) {
  .path-frontpage header {
    display: none !important;
  }
  .path-frontpage .navbar {
    display: none !important;
  }
}

评论

  1. Bash不支持诸如$ [[ "$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 \d之类的字符类。 Bash使用POSIX正则表达式。

  2. \w设置错误代码,但不返回字符串。因此,诸如[[ ... ]]之类的变量分配没有用。

  3. 使用var=[[ ... ]][[时,空格很重要。观察到这失败了:

    ]]

    但这成功了:

    $ [[ 1=1]] && echo yes
    bash: conditional binary operator expected
    bash: syntax error near `yes'
    
  4. Bash(POSIX)正则表达式始终匹配最长的匹配项。它们不支持$ [[ 1 = 1 ]] && echo yes yes 之类的非贪婪匹配。

分配值并捕获缺少的匹配项

.*?

答案 1 :(得分:0)

原始bash代码

  

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

     

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

包含有关bash正则表达式的错误;
-[[ ]]正则表达式不是表达式中的RHS或正确值,因此会出错
-它没有速记功能; bash regex支持的\w, \d, \s等必须执行[A-Za-z _],[0-9],[]等,但是..
-幸运的是,它支持POSIX类集\w by [[:alnum:]] \d by [[:digit:]] \s by [[:space:]],以此类推,请参见其手册
-在重复运算符?*之后,它没有“惰性”量词功能+
-在正则表达式占位符[[ ]]中,某些bash特殊字符仍然适用
 \ > |必须以\\ \> \|和关系运算符== <=等的形式转义

建议:
获取/安装更好的正则表达式引擎,即。具有更好的内置正则表达式功能的更好的编程语言来完成此任务。从sed, perl, awk等内部进行

要达到目标,可能是bash脚本;

[[ "$read_line" =~ (https:.*)' '== ]] && url=${BASH_REMATCH[1]}
[[ "$read_line" =~ ==\>[[:space:]]+([ [:alnum:]]+) ]]&& folder_name=${BASH_REMATCH[1]}