Regex 查找包含某个模式的n次出现的行
我有一个文件,其中包含的行看起来像Regex 查找包含某个模式的n次出现的行,regex,grep,Regex,Grep,我有一个文件,其中包含的行看起来像 A,B,1,2,3,$long,6,"A","",$long,,,,"ABC",,$long,,,, E,F,2,3,4,$long,$long,$long,$long,,,"A","STRING";123456,,,1,2 我的目标是找到包含n个出现的模式“$long”的行 有人知道这场比赛的grep正则表达式吗?你不需要正则表达式。使用awk可以使用$long作为字段分隔符,并检查每行有多少字段: awk -v count=3 'BEGIN {FS="\
A,B,1,2,3,$long,6,"A","",$long,,,,"ABC",,$long,,,,
E,F,2,3,4,$long,$long,$long,$long,,,"A","STRING";123456,,,1,2
我的目标是找到包含n个出现的模式“$long”的行
有人知道这场比赛的grep正则表达式吗?你不需要正则表达式。使用
awk
可以使用$long
作为字段分隔符,并检查每行有多少字段:
awk -v count=3 'BEGIN {FS="\\$long"} NF==(count+1)' file
试验
你不需要正则表达式。使用
awk
可以使用$long
作为字段分隔符,并检查每行有多少字段:
awk -v count=3 'BEGIN {FS="\\$long"} NF==(count+1)' file
试验
应该行得通。您也可以为此使用grep
:
grep -E '(.*\$long){4}' file
E,F,2,3,4,$long,$long,$long,$long,,,"A","STRING";123456,,,1,2
应该行得通。您也可以为此使用grep
:
grep -E '(.*\$long){4}' file
E,F,2,3,4,$long,$long,$long,$long,,,"A","STRING";123456,,,1,2
但是如果$long
可以在上下文中出现,而不是作为它自己的字段出现,例如:
A,B,1,2,3,$long,6,"A","",$long,,,,"ABC$longDEF",,$long,,,,
你只想在它自己的领域中计算它,然后你需要更像:
$ awk -F, -v n=3 '{c=0; for (i=1;i<=NF;i++) if ($i=="$long") c++} c==n' file
错:
$ awk -v n=3 'gsub(/\$long/,"&")==n' file
A,B,1,2,3,$long,6,"A","",$long,,,,"ABC",,$long,,,,
$ awk -v n=4 'gsub(/\$long/,"&")==n' file
E,F,2,3,4,$long,$long,$long,$long,,,"A","STRING";123456,,,1,2
A,B,1,2,3,$long,6,"A","",$long,,,,"ABC$longDEF",,$long,,,,
对:
$ awk -F, -v n=3 '{c=0; for (i=1;i<=NF;i++) if ($i=="$long") c++} c==n' file
A,B,1,2,3,$long,6,"A","",$long,,,,"ABC",,$long,,,,
A,B,1,2,3,$long,6,"A","",$long,,,,"ABC$longDEF",,$long,,,,
$ awk -F, -v n=4 '{c=0; for (i=1;i<=NF;i++) if ($i=="$long") c++} c==n' file
E,F,2,3,4,$long,$long,$long,$long,,,"A","STRING";123456,,,1,2
$awk-F,-vn=3'{c=0;for(i=1;i
但是如果$long
可以在上下文中出现,而不是作为它自己的字段出现,例如:
A,B,1,2,3,$long,6,"A","",$long,,,,"ABC$longDEF",,$long,,,,
你只想在它自己的领域中计算它,然后你需要更像:
$ awk -F, -v n=3 '{c=0; for (i=1;i<=NF;i++) if ($i=="$long") c++} c==n' file
错:
$ awk -v n=3 'gsub(/\$long/,"&")==n' file
A,B,1,2,3,$long,6,"A","",$long,,,,"ABC",,$long,,,,
$ awk -v n=4 'gsub(/\$long/,"&")==n' file
E,F,2,3,4,$long,$long,$long,$long,,,"A","STRING";123456,,,1,2
A,B,1,2,3,$long,6,"A","",$long,,,,"ABC$longDEF",,$long,,,,
对:
$ awk -F, -v n=3 '{c=0; for (i=1;i<=NF;i++) if ($i=="$long") c++} c==n' file
A,B,1,2,3,$long,6,"A","",$long,,,,"ABC",,$long,,,,
A,B,1,2,3,$long,6,"A","",$long,,,,"ABC$longDEF",,$long,,,,
$ awk -F, -v n=4 '{c=0; for (i=1;i<=NF;i++) if ($i=="$long") c++} c==n' file
E,F,2,3,4,$long,$long,$long,$long,,,"A","STRING";123456,,,1,2
$awk-F,-vn=3'{c=0;for(i=1;我可能是个主意。粗略地说,我想到了类似于grep“\(.*\$long\){5}”文件的东西。这是在寻找5(n)个$long事件和一些垃圾,但这不会让我^$long(在一行的开头)。尽管最后一行是$long,但$long后面的逗号也是存在的。好吧,我认为没有必要在当前的解释中使用正则表达式。但是由于您在这里提供了更多信息,可能最好更新您的问题,使其更清楚。顺便说一句,gawk-我目前没有可用的awk-说:gawk:cmd.line:1:警告:escape seuence“\$”被视为普通的“$”
@Krischu注意:我也在使用两个\-->{FS=“\$long”}@Krischu,为了去掉行首可能出现的$long
,只需说FS=“,\$long”。也就是说,在前面加一个逗号。这可能是个主意。我想到了类似于grep”(.\$long){5}文件
粗略地说。这是在寻找5(n)个$long的事件和一些垃圾,但这不会让我^$long(在一行的开头)。尽管最后一行是$long,但$long后面的逗号也是存在的。好吧,我认为没有必要在当前的解释中使用正则表达式。但是由于您在这里提供了更多信息,可能最好更新您的问题,使其更清楚。顺便说一句,gawk-我目前没有可用的awk-说:gawk:cmd.line:1:警告:escape seuence“\$”被视为普通的“$”
@Krischu注意:我也在使用两个\-->{FS=“\\$long”}@Krischu,为了去掉行首可能出现的$long
,只需说FS=“,\$long”。也就是说,在前面加一个逗号。$long
到底是这个值还是一个变量意味着另一件事?@Krischu我挠头想知道是什么让你认为这是一个设计模式问题?@Chetan Kinger:你认为我是如何看待“设计”的模式?正则表达式模式匹配是一个问题。@fedorqui:$long这是我想要形成正则表达式的模式。它代表了它本身,只是一个模式。没有被任何东西替代的特殊意义。@Krischu您将该问题标记为设计模式问题。Diptendu编辑该问题以删除错误的usag标记的e。请单击设计模式标记并阅读说明。一般来说,当您第一次使用标记时,请始终阅读标记wiki。$long
到底是这个值还是一个变量意味着另一件事?@Krishu我挠头,想知道是什么让您认为这是一个设计模式问题?@Chetan Kinger:你认为我是如何看待“设计”的模式?正则表达式模式匹配是一个问题。@fedorqui:$long这是我想要形成正则表达式的模式。它代表了它本身,只是一个模式。没有被任何东西替代的特殊意义。@Krischu您将该问题标记为设计模式问题。Diptendu编辑该问题以删除错误的usag请单击design patterns标记并阅读说明。一般来说,当您第一次使用标记时,请始终阅读标记wiki。这正是我想要的。我的问题包含“grep”和“regex”。感谢所有的awk内容,但我的目标是grep和模式匹配。awk解决方案对我不起作用-太尴尬了:)在gawk中不起作用。我喜欢这个解决方案,因为它提醒我在grep中使用-E开关(!)另一方面:虽然我很喜欢这个解决方案,但它在这里对我不起作用。哦,对不起,忘记了反斜杠(或者您同时编辑了吗)?这个解决方案应该得到一个增强:当字符串包含5次$long时,grep(搜索4次出现也与包含5次出现的行相匹配。此命令查找给定行中最少出现的搜索字符串,即$long
。因此它确保至少出现4次$long
。这正是我要查找的。我的问题包含“grep”和“regex”。感谢所有的awk内容,但我的目标是grep和模式匹配。awk解决方案对我不起作用-太尴尬了:)在gawk中不起作用。我喜欢这个解决方案,因为它提醒我在grep中使用-E开关(!)另一方面:虽然我很喜欢这个解决方案,但它在这里对我不起作用。哦,对不起,忘记了反斜杠(或者您同时编辑了吗)?这个解决方案应该得到一个增强:当字符串包含5次$long时,grep(搜索4次出现也与包含5次出现的行相匹配。此命令查找给定行中出现的最少搜索字符串,即$long
。因此,它确保至少出现4次