Regex 删除所有没有';不符合模式

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

我正在寻找一种方法来删除所有不遵循特定模式的行(从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/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'.*/.*/.*/.*/*