Regex 删除所有没有';不符合模式
我正在寻找一种方法来删除所有不遵循特定模式的行(从txt文件) 我需要保留线条的图案:Regex 删除所有没有';不符合模式,regex,awk,sed,grep,gawk,Regex,Awk,Sed,Grep,Gawk,我正在寻找一种方法来删除所有不遵循特定模式的行(从txt文件) 我需要保留线条的图案: x//x/x/x/5/x/ x可以是任意数量的字符、数字或特殊字符 5始终是字母数字的组合-5个字符-例如Xf1Lh,始终出现在第5个正斜杠之后 /是实际的前斜杠 输入: abc//a/123/gds:/4AdFg/f3dsg34/ y35sdf//x/gd:df/j5je:/x/x/x yh//x/x/x/5Fsaf/x/ 45WHRT//x/x/dsfhsdfs54uhb/ 5ehys//srt/fd/a
x//x/x/x/5/x/
x
可以是任意数量的字符、数字或特殊字符
5
始终是字母数字的组合-5个字符-例如Xf1Lh,始终出现在第5个正斜杠之后
/
是实际的前斜杠
输入:
abc//a/123/gds:/4AdFg/f3dsg34/
y35sdf//x/gd:df/j5je:/x/x/x
yh//x/x/x/5Fsaf/x/
45WHRT//x/x/dsfhsdfs54uhb/
5ehys//srt/fd/ab/cde/fg/x/x
期望输出:
abc//a/123/gds:/4AdFg/f3dsg34/
yh//x/x/x/5Fsaf/x/
grep
根据正则表达式选择行,您的x//x/x/x/5/x/
只需稍作更改即可将其转换为正则表达式:
$ grep -E '.*//.*/.*/.*/[[:alnum:]]{5}/.*/' file
abc//a/123/gds:/4AdFg/f3dsg34/
yh//x/x/x/5Fsaf/x/
说明:
- “x可以是任意数量的字符、数字或特殊字符”。在
正则表达式中,其中*
表示任何字符,
表示前面的零个或多个字符(在本例中为*
) - “5始终是字母数字-5个字符的组合”。在POSIX正则表达式中,
表示任何字母数字字符[:alnum:]
指上述五项{5}
[[:alnum:][/code>是unicode安全的
x
。在上面的示例中,x
可以是任何字符。然而,正如triplee所指出的,另一个合理的解释是,x
应该是除/
之外的任何字符。在这种情况下:
grep -E '[^/]*//[^/]*/[^/]*/[^/]*/[[:alnum:]]{5}/[^/]*/' file
另外,我们可能希望这个正则表达式只匹配完整的行。在这种情况下,我们可以用^
一个$
包围正则表达式,或者使用grep的-x
选项:
grep -xE '[^/]*//[^/]*/[^/]*/[^/]*/[[:alnum:]]{5}/[^/]*/' file
grep
根据正则表达式选择行,您的x//x/x/x/5/x/
只需稍作更改即可将其转换为正则表达式:
$ grep -E '.*//.*/.*/.*/[[:alnum:]]{5}/.*/' file
abc//a/123/gds:/4AdFg/f3dsg34/
yh//x/x/x/5Fsaf/x/
说明:
- “x可以是任意数量的字符、数字或特殊字符”。在
正则表达式中,其中*
表示任何字符,
表示前面的零个或多个字符(在本例中为*
) - “5始终是字母数字-5个字符的组合”。在POSIX正则表达式中,
表示任何字母数字字符[:alnum:]
指上述五项{5}
[[:alnum:][/code>是unicode安全的
x
。在上面的示例中,x
可以是任何字符。然而,正如triplee所指出的,另一个合理的解释是,x
应该是除/
之外的任何字符。在这种情况下:
grep -E '[^/]*//[^/]*/[^/]*/[^/]*/[[:alnum:]]{5}/[^/]*/' file
另外,我们可能希望这个正则表达式只匹配完整的行。在这种情况下,我们可以用^
一个$
包围正则表达式,或者使用grep的-x
选项:
grep -xE '[^/]*//[^/]*/[^/]*/[^/]*/[[:alnum:]]{5}/[^/]*/' file
您可以使用
-p
选项来扩展perl支持,如
grep -P "^(?:[^/]*/){5}[A-Za-z0-9]{5}/(?:/|$)" input
输出
正则表达式分解
您可以使用
-p
选项来扩展perl支持,如
grep -P "^(?:[^/]*/){5}[A-Za-z0-9]{5}/(?:/|$)" input
输出
正则表达式分解
我正在琢磨如何在awk中做这件事,同时给出了另一个答案,并得出:
awk -F/ 'BEGIN{OFS=FS}$2==""&&$6~/[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]/&&NF=8'
我计算出来的awk不支持
{5}
regexp frob。我正在研究如何在awk中与另一个答案同时进行,并得出以下结论:
awk -F/ 'BEGIN{OFS=FS}$2==""&&$6~/[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]/&&NF=8'
我计算出来的awk不支持
{5}
regexp frob.使用sed和就地编辑删除所有不遵循特定模式的行(从txt文件):
-i.bak
就地编辑创建test.in.bak备份文件,-n
安静,不要打印不匹配的输出
和
“../p”
打印匹配项。使用sed和就地编辑删除不遵循特定模式的所有行(从txt文件):
-i.bak
就地编辑创建test.in.bak备份文件,-n
安静,不要打印不匹配的输出
和“../p”打印匹配项。GnuWin32 grep是否提供与实际grep相同的功能?根据您的解释,正则表达式对我来说非常有意义,但是将示例输入放在
test.txt
中并像运行grep-E.*/.*/.*/.*/.*/[:alnum:]{5}/.*/'c:\test.txt>c:\out.txt一样运行,输出文件返回为空。@user327685 Hmm。我在Linux上使用的是“GNU grep v2.25”。你在下面跑什么壳?在Windows上,某些Shell需要不同的引用。IIRC,在某些Windows shell下运行可能需要将单引号()
)替换为双引号(“
)。在将”
(我在Windows上)替换为测试输入后,我成功地使用了它,然后我尝试了返回为空的实际数据(800MB文件),然后再次在测试输入上重试,而现在它一直在失败,结果是空的。我现在已经安装了cygwin并在那里进行了尝试,但也一直失败,这真的令人沮丧,有什么想法吗?原来文本文件是二进制编码的,出于某种原因,它现在起作用了。谢谢为了提高精度,请将整个*
替换为[^/]*
可以匹配斜杠,去掉字段编号。您还应该添加^
和$
行锚,以防止正则表达式与中间行匹配。GnuWin32 grep是否提供与实际grep相同的功能?根据您的解释,正则表达式对我来说非常有意义,但是将示例输入放在test.txt
中并像这样运行grep-E'.*/.*/.*/.*/*