【问题标题】:Can OR expressions be used in ${var//OLD/NEW} replacements?可以在 ${var//OLD/NEW} 替换中使用 OR 表达式吗?
【发布时间】:2015-12-26 14:40:06
【问题描述】:

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

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

是我尝试使用的主要操作,上面的行有效,将所有出现的&lt;title&gt; 替换为$(get_title) 上的$FINAL_STRING... 和

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

工作,分配 $1 与从开头到第一次出现 ::: 的所有内容替换为空(已删除)。然而# 做我期望^ 做的事情。 加上当我在这里尝试使用{,,} glob 表达式时:

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

${SUFFIX} 替换任何出现的 &lt;suffix&gt; OR &lt;extension&gt; ,它不起作用。

所以我看到它不需要正则表达式,也不需要全局模式......那么它需要什么?是否有任何关于普通 bash 字符串操作(特别是子字符串替换)可以理解的符号/表达式的详尽列表?还是 *?###%%% 是唯一有效的东西?

(我试图只依赖 plain bash,而不调用 sedgrep 来做我想做的事)

【问题讨论】:

  • 一个好的 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 关闭

标签: regex string bash glob


【解决方案1】:

血淋淋的细节可以在 bash 手册中找到,Shell Expansions 部分。整个画面非常复杂。

Shell Parameter Expansion 部分描述了您正在执行的操作。你会看到

中的模式
${parameter/pattern/string}

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

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

【讨论】:

  • 现在,打开extglob,这条线INPUT_INFO=${INPUT_INFO// +( ):+( )/:::} 冻结了执行...关于为什么的任何想法?
  • 看不出有什么明显的问题。请发布一个包含足够信息的新问题以重现您的问题(包括您的实际输入和您想要实现的目标)。
【解决方案2】:

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

见:http://www.linuxjournal.com/content/bash-regular-expressions

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

对于除了 bash 也可以在 shell 中运行的代码,老派的做法确实是使用 #/##/%/%% 以及围绕 @987654328 的循环@ 语句(支持基本的* glob 匹配)。

【讨论】:

    猜你喜欢
    • 2017-02-05
    • 2015-12-24
    • 2012-03-20
    • 2020-05-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2010-11-02
    • 2021-02-12
    相关资源
    最近更新 更多