我有一个文件名列表,我希望删除其中包含不同字母或字符串的项目。
如果我跑
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
不是-
)