我有一个如下文件:
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脚本中的某些条件来分隔单词(字母和数字)和特殊字符?
提前致谢
答案 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