2009-07-22 66 views
2

我有一行文本,我正在使用grep来查看字母d是否存在。这是怎么回事的例子:grep - 处理引号内的文本

返回1,这是正确的:

echo d file='hello world' | grep -c -w d 

返回0,这是正确的:

echo file='hello world' | grep -c -w d 

返回1,这是正确的:

echo d file='hello world d' | grep -c -w d 

返回1 - 应返回0:

echo file='hello world d' | grep -c -w d 

我需要它忽略单引号里面的数据。 grep是在这里使用的正确工具还是有其他可能有帮助的东西?

+1

不要引述字符串有跨越线?还有其他引用字符吗?有没有嵌入引号的字符串? – 2009-07-22 15:43:57

回答

5

我会使用sed删除引号内的所有文本,然后在sed的输出上执行grep。事情是这样的:

echo "d 'hi there'" | sed -r "s|'[^']*'||g" | grep -c -w d 
2

管通过工具的输出来摆脱你不想要的东西,例如sed

echo d file='hello world' | sed -e "s:'[^']*'::g" | grep -c -w d 

这写着:更换(s)任何事情匹配正则表达式(用:分隔)与空字符串。

1

根据您所提供的信息,这应该工作:

grep的-c -E “?^ [^ ']?*?* d' *'”

 
%> cat blah.sh 

echo d file=\'hello world\' | grep -c -E "^[^']*?d.*?'.*?'" 
echo file=\'hello world\' | grep -c -E "^[^']*?d.*?'.*?'" 
echo d file=\'hello world d\' | grep -c -E "^[^']*?d.*?'.*?'" 
echo file=\'hello world d\' | grep -c -E "^[^']*?d.*?'.*?'" 

%> ./blah.sh 
1 
0 
1 
0