【问题标题】:bash4 - creating array of directory contents on regex filterbash4 - 在正则表达式过滤器上创建目录内容数组
【发布时间】:2014-10-04 16:08:08
【问题描述】:

在过滤目录时寻找一种基于正则表达式创建 bash 数组的方法。

例如我这样做:

A. local -a arr=( "$1"/* ); arr=( "${arr[@]##*/} );
- Creates array of all contents of the path sent in $1.
B. local -a arr=( "$1"/*"$2" ); arr=( "${arr[@]##*/}" );
- Creates array on filter expression in $2.

(我不知道为什么 * 没有出现在 B 的 "$1"/*"$2" 中。如果我把 2 ** 都显示出来!)

但它只适用于简单的表达式:示例 '.pub' - 列出所有公钥。

但是,如果我发送“z.*.zip”来查找所有以“z.”开头的 zip 文件不工作。

我什至尝试在arr=( "$1"/*"$2" ) 中取出*"$2"*"$2" 没有出现!

非常感谢您的帮助。

谢谢。

【问题讨论】:

  • 您的问题需要进一步澄清。 $2 的值是多少?您打算与之匹配的文件是什么?

标签: arrays regex bash filter bash4


【解决方案1】:

Glob 不会在双引号中展开。你必须取消引用它:

local -a arr=( "$1"/*$2 ); 

为避免出现空格问题,您可以先使用IFS="" 来禁止分词,同时仍对未引用的变量进行全局扩展。

这是一个调用示例:

$ cat script

foo() {
  local -a arr=( "$1"/*$2 );
  echo "Matching files: " "${arr[@]}"
}

foo "." "z.*.zip"

$ ls
lobsters.png  pelican.zip  script  z.bar.zip  z.cow.txt

$ bash script
Matching files:  ./z.bar.zip

$

【讨论】:

  • 但他说所有文件都以z.开头。
  • 太棒了!感谢“其他人”!stackoverflow 的新手。我该如何结束这个问题?
  • 当您说 Glob 时,他们指的是所有正则表达式?那我什么时候使用 IFS?
  • 如果这解决了您的问题,答案旁边有一个 ✔ 复选标记,您可以点击接受它。
  • 全局和正则表达式看起来很相似,用于相似的事情,但它们并不相同。 z.*.zip 是一个 glob,不应被引用,以便 shell 扩展它。 grep 之类的工具改用正则表达式(例如 z\..*\.zip),这些应该被引用,以便 shell 直接将其传递给 grep。
猜你喜欢
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 2011-04-17
  • 1970-01-01
  • 2019-10-06
  • 2019-10-04
  • 2013-06-25
相关资源
最近更新 更多