如何从文件grep精确匹配特殊字符?

时间:2014-12-16 10:51:32

标签: regex linux perl shell grep

我有一个如下文件:

A   4   ab,cc,ab,bc
B   6   x,xx,y,%,%%,\,\\
AB  0   

我需要从文件的第三列grep特殊字符并返回其对应的第一列。例如,我需要grep'%'并且它会返回B(它对应的第一列)

我尝试过使用:

grep -w "%" file1

但它会返回%和%%。像:

B   6   x,xx,y,%,%%,\,\\

其中%,%%突出显示。我只想要搜索确切的单词/字符。在上述情况下,它应该只是试图找到'%'而不是' %%'。这种方法适用于单词,因为当grep手册grep -w找到包含构成整个单词的匹配的行时,它会起作用。

我也试过用

grep -wP "%" file1

用于Perl之类的模式。但没有回报任何东西。

有谁能建议我如何才能找到完全匹配的特殊字符?然而,这并没有解决特殊字符的问题'。反斜杠可以转义和处理。但对于其他特殊角色,我需要找到解决方案。


行。我的问题需要稍作修改。根据我的问题,这里给出的所有答案都很棒并且工作得非常好。但也许我错过了另一个要求。我的错。由于此处使用的所有解决方案都是'%'作为测试参数,但是'%'只是我的榜样。我真正想要的是更多为所有单词/字符工作的通用解决方案。我举个例子。请考虑以下文件:

A   4   a    b,c            c,ab,bc
          ^          ^
          ^     couple of tabs here
      multiple spaces here
B   6   x,xx,y,%,%%,\,\\
AB  0 

我的意思是说该文件可以包含任何类型的字符,单词(由单个/多个空格,制表符等分隔)以及任何特殊字符(包括单引号('),double引用("),反斜杠())。这三个需要特别处理,因为它们是保留的。

我为之前遗漏这部分而道歉,但我希望我现在想要的那种解决方案现在很清楚了。

我会投票支持特殊字符的所有工作解决方案。但它不允许我(声誉较低)。但是会有一般的解决方案吗?或者如果我可以通过shell脚本中的某些条件来分隔单词(字母和数字)和特殊字符?

提前致谢

5 个答案:

答案 0 :(得分:2)

从命令行使用perl,

perl -nE 'say /(\S+)/ if /%/' file

答案 1 :(得分:1)

awk

怎么样?
$ awk '/%/{print $1}' inputFile
B

要匹配文件中的确切%,您可以使用lookarounds

$ grep -o '(?<!%)%(?!%)' input
  • (?<!%)背后的正面看法。断言%

  • %未提出(?!%)
  • %负面展望。断言%后面没有{{1}}

答案 2 :(得分:0)

您可以使用扩展匹配:

$ grep -P '(?<=[\s|,])%(?=[,$])' file
B   6   x,xx,y,%,%%,\,\\
               ^
               highlighted

如果它被空格或,,或行尾包围,则只会匹配。

解释

grep -P '(?<=[\s|,])%(?=[,$])'
  • -P make grep使用扩展的Perl regexp。
  • (?<=X)表示:检查之前是否有X
  • [\s|,]表示:空格字符或逗号。
  • (?=Y)表示:检查匹配后是否有Y
  • [,$]表示:逗号或行尾。

答案 3 :(得分:0)

使用perl,按行自动分割 - 这会将空格上的字段拆分为零索引数组 @F 。然后,如果第3个字段( $ F [3] )与正则表达式匹配,我会打印第一个字段( $ F [0]

使用否定字符类仅匹配不是%的事物包围的一个%。如果您一直在寻找以逗号分隔的字段,则可以匹配。如果您不了解分隔符,许多其他答案已经为您提供了一些前瞻/后瞻性表达的示例

$ perl -lane 'print $F[0] if $F[2] =~ "[^%]%[^%]" ' < file1 
B

答案 4 :(得分:0)

您可以将grep与-P参数一起使用。

$ grep -oP '^\S+(?=\s+\S+\s+\S*(?<!%)%(?!%)\S*)' file
B

示例:

$ cat hi
A   4   ab,cc,ab,bc
B   6   x,xx,y,%,%%,\,\\
AB  0   
C   6   x,xx,y,%%
$ grep -oP '^\S+(?=\s+\S+\s+\S*(?<!%)%(?!%)\S*)' hi
B