【发布时间】:2015-12-26 14:40:06
【问题描述】:
我在 bash 脚本中测试了一些字符串操作的东西,我很快意识到它不理解正则表达式(至少不是我用于字符串操作的语法),然后我尝试了一些 glob 表达式,它似乎理解其中一些,有些则不。具体来说:
FINAL_STRING=${FINAL_STRING//<title>/$(get_title)}
是我尝试使用的主要操作,上面的行有效,将所有出现的<title> 替换为$(get_title) 上的$FINAL_STRING... 和
local field=${1/#*:::/}
工作,分配 $1 与从开头到第一次出现 ::: 的所有内容替换为空(已删除)。然而# 做我期望^ 做的事情。 加上当我在这里尝试使用{,,} glob 表达式时:
FINAL_STRING=${FINAL_STRING//{<suffix>,<extension>}/${SUFFIX}}
用 ${SUFFIX} 替换任何出现的 <suffix> OR <extension> ,它不起作用。
所以我看到它不需要正则表达式,也不需要全局模式......那么它需要什么?是否有任何关于普通 bash 字符串操作(特别是子字符串替换)可以理解的符号/表达式的详尽列表?还是 *、?、#、##、% 和 %% 是唯一有效的东西?
(我试图只依赖 plain bash,而不调用 sed 或 grep 来做我想做的事)
【问题讨论】:
-
一个好的 StackOverflow 问题的范围是有限的——要求一个完全详尽的子语言列表足够广泛,因此有资格被关闭。也就是说,如果您想要详细讨论 bash 中的本机字符串操作,请参阅 BashFAQ #100:mywiki.wooledge.org/BashFAQ/100
-
参数扩展的bash-hackers页面也是一个很好的参考:wiki.bash-hackers.org/syntax/pe
-
至于在 PE 中使用大括号扩展,我不知道您为什么希望它首先能够工作。大括号扩展创建多个单词;根本不允许解析为多个单词的参数扩展。
-
@CharlesDuffy 是的...我只是在测试可能性。现在我在 (
shopt -s extglob) 上使用extglob选项并将{a,b,c}替换为@(a|b|c)... 非常有用,因为根据那个问题stackoverflow.com/questions/17191622/…,没有理由离开extglob关闭