我的目的是确定配置文件中是否存在整行。 这是一个例子:
ports.conf:
#NameVirtualHost *:80
NameVirtualHost *:80
现在我想搜索NameVirtualHost *:80
但不是#NameVirtualHost *:80
!
我对此的第一个想法当然是使用grep。像这样:
grep -F "NameVirtualHost *:80" ports.conf
这给了我两行不我想要的东西。
我的第二个想法是使用这样的正则表达式:grep -e "^NameVirtualHost \*:80" ports.conf
。但显然现在我必须处理转义特殊字符行*
这可能不是什么大问题,但是我希望传递单个搜索字符串,并且在使用我的脚本时不想使用转义字符串。
所以我的问题是: 如何逃避特殊字符?或如何使用不同的工具获得相同的结果?
答案 0 :(得分:4)
grep
有一个选项-x
就是这样做的:
-x, --line-regexp
Select only those matches that exactly match the whole line. (-x is specified by POSIX.)
因此,如果您将第一个命令更改为grep -Fx "NameVirtualHost *:80" ports.conf
,则可以获得所需内容。
答案 1 :(得分:1)
使用printf escaping
printf '%q' 'NameVirtualHost *:80'
一起
grep -e "^`printf '%q' 'NameVirtualHost *:80'`$" test
或者
reg="NameVirtualHost *:80"
grep -e "^`printf '%q' "$reg"`$" test
答案 2 :(得分:0)
我能想到保持正则表达式简单的最快方式是
grep -F "NameVirtualHost *:80" ports.conf | grep -v "^#\|^\/\/"