首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[]大于9的访问序列[]

[]大于9的访问序列[]
EN

Stack Overflow用户
提问于 2016-04-26 00:29:58
回答 1查看 66关注 0票数 1

我想用sed更改一系列编号文件名(超过10个)。我可以使用sed -i 's/old/new/g' myfile[0-9]轻松地访问0-9,但这似乎不适用于大于10的数字。就像[0-50]

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-26 00:39:05

字符类(如[0-9][a-f] )只匹配单个字符。它们本身与“数字”不匹配--即使给出的数字是数字,它们也只是被视为字符代码点,而不是数字值。在fnmatch()-style模式(在这里由shell使用)中,这与正则表达式中的情况是一样的。

如果需要0-50,则可以通过组合多个字符类来实现全局行为(只匹配存在的文件),如下所示:

代码语言:javascript
复制
shopt -s nullglob # if no files match, return empty result
files=( myfile[0-9] myfile[1-4][0-9] myfile5[0] )

# if list of files is nonzero, run sed:
(( ${#files[@]} )) && sed -i -e 's/old/new/g' "${files[@]}"

要解释这是如何工作的:

  • myfile[1-9]匹配1-9 (如果它们存在)
  • myfile[1-4][0-9]匹配10-49 (如果它们存在)
  • myfile5[0]匹配50,当且仅当它存在时。

将文件列表放入数组并检查数组的长度可以确保没有列出任何文件名就不会运行sed,否则会因为nullglob而发生这种情况。(为什么在这里使用nullglob?)因为如果不存在myfile5[0],则不希望将myfile50作为文字文件名传递,否则这是默认行为)。

POSIX sh标准还有一些其他扩展可供使用:

如果您不关心文件是否存在(并且希望将内容放到命令行,即使它们不存在),则可以使用大括号展开:

代码语言:javascript
复制
sed -i -e 's/old/new/g' myfile{0..50}

或者,如果您只关心在文件名末尾匹配一个或多个数字数字,则可以使用extglobs:

代码语言:javascript
复制
shopt -s extglob
sed -i -e 's/old/new/g' myfile+([0-9])
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36853389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档