【问题标题】:Case insensitive search and replace in array bash array数组bash数组中不区分大小写的搜索和替换
【发布时间】:2015-05-26 11:53:16
【问题描述】:

我学习了here 关于使用数组在数组中搜索和替换的知识。

事情是这样的。

declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora');
echo ${Unix[@]/Red*/}

# Output will be
Debian Ubuntu Suse Fedora

在上面的 sn-p 中,标志a 用于不区分大小写的搜索。即我想用“红色”而不是“红色”进行搜索。

【问题讨论】:

  • declare -a 与区分大小写无关;它的意思是“声明这是一个数组”

标签: arrays bash replace case-insensitive


【解决方案1】:

只需将rR 放入字符类[]

$ declare -a Unix=('Debian' 'red hat' 'Ubuntu' 'Suse' 'Fedora');
$ echo ${Unix[@]/[rR]ed*/}
Debian Ubuntu Suse Fedora

【讨论】:

  • 所以这只是一个单词,如果我需要对所有单词都这样做(假设我必须这样做)。我会写 $ echo ${Unix[@]/[a-z][A-Z]ed*/} ??
  • 使用${Unix[@]/[a-zA-Z]ed*/},这将删除具有red、Red、sed、fed等的elem。
  • 谢谢,这意味着没有特殊的开关,只有基本的正则表达式。 :)
  • @tollboy:它们不是正则表达式。它们是 bash 模式。 (这就是为什么你写* 而不是.* 的原因,例如。)在某些情况下,你可以使用shopt nocaseglobshopt nocasematch 使模式匹配不区分大小写,但它们都不适用于搜索和替换参数扩展。
【解决方案2】:

您可以在此处使用printfgrep -i

printf "%s\n" "${Unix[@]}" | grep -iv Red
Debian
Ubuntu
Suse
Fedora

printf "%s\n" "${Unix[@]}" | grep -iv red
Debian
Ubuntu
Suse
Fedora

更新:要获得单行输出:

printf "%s\n" "${Unix[@]}" | grep -iv red | tr '\n' ' '; echo
Debian Ubuntu Suse Fedora

【讨论】:

  • 谢谢,但我需要单行输出。如果我们删除 \n 那么它将删除所有内容。 :D
  • 确保检查更新的答案以获得单行输出。
猜你喜欢
  • 2011-05-09
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
相关资源
最近更新 更多