我正在尝试查找与grep中作为变量接收的正则表达式模式匹配的行。当我直接在命令替换中使用模式执行grep时,它可以工作。当我为模式使用变量时,不会。
#!/bin/bash
pattern="'^\\\".*\\\"$'"
echo "pattern : $(echo $pattern)"
NB=$(grep -c -E -v -e ${pattern} abc.txt)
NB2=$(grep -v -c -E -e '^\".*\"$' abc.txt)
echo " -> $NB , $NB2"
除了代码中的内容,我还尝试过:
NB=$(grep -c -E -v -e $(echo $pattern) abc.txt)
没有成功。
cmd="grep -c -E -v -e ${pattern} abc.txt"
NB="$($cmd)"
没有成功。
在示例中,abc.txt
文件包含3行:
"abc"
"abc
abc"
变量中的模式似乎正常:
pattern : '^\".*\"$'
我期望NB和NB2中的2个数字相同。如果您查看代码,则实际结果是:
pattern : '^\".*\"$'
-> 3 , 2
我希望:
pattern : '^\".*\"$'
-> 2 , 2
答案 0 :(得分:1)
NB2=$(grep -v -c -E -e '^\".*\"$' abc.txt)
如果可行,则将确切的正则表达式分配给$pattern
。不要添加更多的反斜杠和引号。
pattern='^\".*\"$'
引用可变扩展名总是一个好主意,以防止不必要的通配符扩展和单词拆分。
NB=$(grep -c -E -v -e "${pattern}" abc.txt)
# ^ ^