我在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 ,而不是调用sed
或grep
来做我想要的事情)
答案 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匹配)。