【问题标题】:bash parameter expansion search-and-replace capture groupsbash 参数扩展搜索和替换捕获组
【发布时间】:2014-06-25 20:24:04
【问题描述】:

当使用 bash 风格的 search-and-replace parameter expansion 时,有没有办法在模式中引用捕获的子字符串?

例如,我想在以“(some digit).mp3”结尾的文件名中插入前导0。这些文件的名称中有其他括号,所以我需要寻找最接近结尾的接近括号:

${x/\(([[:digit:]]\).mp3)/\(0}

这不太有效,b/c 它不会重新替换字符串的前一个结尾。

在 bash 或 zsh 中有没有办法引用捕获的字符串? $BASH_REMATCH 似乎不起作用。

【问题讨论】:

  • 查看您链接的页面,似乎无法捕获部分搜索,更不用说引用它们了。您最终可能不得不使用sed 来完成工作。
  • 您要为某个数字部分还是整个文件名添加前缀?
  • “某位数字”。

标签: bash zsh


【解决方案1】:

你可以使用sed

sed 's/\(.*(\)\([0-9][0-9]*).mp3\)/\10\2/'

我认为这可以获得所需的功能...我确信有一种更巧妙的方法可以做到这一点,我自己刚刚开始学习sed

【讨论】:

  • 这就是我最终要做的。 mv "$x" "`basename $x | sed 's/(\([[:digit:]]).mp3\)/(0\1/'`"
【解决方案2】:

一种方法是首先从文件名中去除扩展名,只在name 中留下基本文件名。接下来使用name - 1 的长度作为字符串索引,返回name 中的最后一个字符。最后,对照) 检查lastchar。

name="${filename%.*}"  # remove extension from filename

if [[ ${name:((${#name}-1))} == ")" ]]; then   ## just isolates last char and test again ")"
    # modify as needed to insert '0'
    newfilename="0${filename}" # to append the '0' to beginning of filename
fi

注意:不需要新变量nefilename,这只是为了说明。只需将0 添加到带有filename="0${filename}" 的文件名就可以了

【讨论】:

  • 这里有一点解释性文字会有很大帮助。
  • 对不起,必须在4:00 接女儿,我已经填写了上面的解释。如果您还有其他问题,请尽管提问。很好地抓住了答案的简洁性:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2022-01-16
  • 1970-01-01
  • 2023-04-08
  • 2017-09-27
相关资源
最近更新 更多