bash 脚本、grep、VAR 中的参数?

bash 脚本、grep、VAR 中的参数?

我有一个文件名列表,我希望删除其中包含不同字母或字符串的项目。

如果我跑

cat <file> | grep -Ev 'P1|P2'

在 bash shell 中它可以工作。

但在脚本中

#!/bin/bash
...
PLIST="f,d"    #test example
GARG="'$(echo $PLIST | tr "," "|" |tr -d "\n")'"
cat $FNAME | grep -Ev $GARG

这不起作用。它只是列出文件中的所有行。

我尝试回显 $GARG,其值为: 'f|d'

问题是我生成 GARG 的方式。

GARG=$(echo $PLIST | tr "," "|" |tr -d "\n")

这是可行的,但如果我 echo $GARG ,则该值是: f|d ,不带 ' ' 字符。

我不明白为什么它不适用于 ' ' 字符,但没有它们却可以?

答案1

$FNAME要打印其路径存储在不匹配存储在 in 中的扩展正则表达式的文件的行$GARG,在类似 Bourne 的 shell(例如 bash)中,语法为:

FNAME=/path/to/some/file
GARG='P1|P2'
grep -Eve "$GARG" < "$FNAME"

要删除包含数组中任何元素的行(假设这些元素不包含换行符并且数组不为空),在类似 ksh93 的 shell(例如 bash)中:

list=(P1 P2)
FNAME=/path/to/some/file
grep -Fv "${list[@]/#/-e}" < "$FNAME"

或者:

list=(P1 P2)
FNAME=/path/to/some/file
printf '%s\n' "${list[@]}" | grep -Fvf - -- "$FNAME"

(人们假设$FNAME不是-

相关内容