我无法在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
答案 0 :(得分:1)
尝试:
@media (max-width: 767.98px) and (orientation: landscape) {
.path-frontpage header {
display: none !important;
}
.path-frontpage .navbar {
display: none !important;
}
}
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正则表达式。
\w
设置错误代码,但不返回字符串。因此,诸如[[ ... ]]
之类的变量分配没有用。
使用var=[[ ... ]]
和[[
时,空格很重要。观察到这失败了:
]]
但这成功了:
$ [[ 1=1]] && echo yes
bash: conditional binary operator expected
bash: syntax error near `yes'
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]}