可以在$ {var // OLD / NEW}替换中使用OR表达式吗?

时间:2015-12-26 14:40:06

标签: regex string bash glob

我在bash脚本中测试了一些字符串操作的东西,我很快意识到它不理解正则表达式(至少不是我用于字符串操作的语法),然后我'尝试了一些glob表达式,它似乎理解了其中一些,有些则没有。具体来说:

FINAL_STRING=${FINAL_STRING//<title>/$(get_title)}

是我正在尝试使用的主要操作,上述行有效,在<title>上用$(get_title)替换$FINAL_STRING的所有出现...和

local field=${1/#*:::/}

有效,为$1指定从:::开头到第一次出现的所有内容都被替换为(已删除)。但是,#执行我期望^做的事情。当我尝试在这里使用{,,} glob表达式时 Plus

FINAL_STRING=${FINAL_STRING//{<suffix>,<extension>}/${SUFFIX}}

<suffix>替换<extension> OR ${SUFFIX}的任何出现,但不起作用。

所以我看到它不采用正则表达式而且它也不采用glob模式......所以它需要什么?有没有详尽列出普通bash字符串操作(特别是子字符串替换)可以理解的符号/表达式?或*?###%%%是唯一有效的内容吗?

(我只想依靠普通bash ,而不是调用sedgrep来做我想要的事情)

2 个答案:

答案 0 :(得分:2)

可以在bash手册 Shell Expansions 部分找到详细信息。完整的画面非常复杂。

Shell Parameter Expansion 部分介绍了您正在做的事情。你会在

中看到这种模式
${parameter/pattern/string}

使用 Filename Expansion 规则,而这些规则不包括 Brace Expansion - 这是在处理命令行参数时提前完成的。文件名展开“仅”会?*[...]匹配(除非设置extglob)。

但是参数扩展不仅仅是文件名扩展,特别是您注意到#%的锚定。

答案 1 :(得分:1)

bash 实际上处理正则表达式;具体来说,[[ =~ ]]运算符,然后您可以使用魔术变量$BASH_REMATCH将其分配给变量。它很时髦,但它确实有效。

请参阅:http://www.linuxjournal.com/content/bash-regular-expressions

请注意,这是仅限bash的 hack 功能。

对于除了bash之外在shell中工作的代码,旧学校这样做的方式确实是使用# / ## / % / %%以及围绕case语句的循环(支持基本的* glob匹配)。