【问题标题】:fgrep with string containing flags带有包含标志的字符串的 fgrep
【发布时间】:2014-03-05 16:36:14
【问题描述】:

我想用许多标志运行管道到 fgrep:

echo "hi" | fgrep -e hi -e bye -e don ...

为此,我想预先创建包含标志和字符串的字符串。基本上,我正在尝试这样做:

STR="-e hi"
STR="${STR} -e bye"
echo "nihibyehi\nhello\nhi" | fgrep ${=STR}

但我收到以下错误:

${=STR}: bad substitution

肯定有一种方法可以通过 fgrep 以这种方式执行此操作(使用“fgrep ${=STR}”)。这是什么?

【问题讨论】:

  • 你为什么要${=STR}?为什么不只是${STR}
  • 根据您在下面的评论,看起来唯一的问题是您尝试使用 错误的 shell 运行您的 - 有效 - zsh 代码。请确认。
  • 是的,这就是问题所在。非常感谢!

标签: bash unix grep arguments zsh


【解决方案1】:

更新

OP 显然使用zsh,但仅将问题标记为shell(建议与POSIX 兼容)。

可能发生的情况是他/她尝试使用 不同 shell 运行上述 zsh 特定代码,导致 bad substitution 错误 - bash 会给出该错误,例如。

当使用zsh 运行时,上面的代码确实有效——它使用zsh 的字符串分割标志=$STR 的内容分解为单个单词——但它不能很好地概括: 例如,如果搜索字符串嵌入了空格,那么解决方案就会中断。

下面是一个更强大的解决方案,它适用于 zshbash,以及一个适用于 POSIX 兼容 shell 的解决方案。


假设您使用的是 bashzsh

使用一个数组来构建你的参数列表,然后将整个数组双引号传递给fgrep

STR=('-e' 'hi')
STR+=('-e' 'bye')
printf 'nihibyehi\nhello\nhi\n' | fgrep "${STR[@]}"

对于 POSIX 兼容的 shell(如果不使用 bashzsh 选项),您可以将搜索字符串写入(临时)文件并使用 -f 选项将其传递给fgrep:

echo 'hi' > STRs.txt
echo 'bye' >> STRs.txt
printf 'nihibyehi\nhello\nhi\n' | fgrep -f STRs.txt

【讨论】:

  • DATE="-e .2013-03-26.-e .2013-03-27.";对于 $(ls | fgrep ${=DATE}) 中的文件;做;回声 ${文件};完成;
  • @user1145925:如果这对您有用,您可能会使用zsh,您应该以这种方式标记您的问题。 shell 在 Unix 上下文中意味着一个与 POSIX 兼容的 shell,但您正在使用的功能 - 拆分标志 = - 不是。 (附带说明,您不应该使用 for 解析命令输出 - 请改用 while IFS='' read -r ...。)
猜你喜欢
  • 2017-03-17
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多