删除与模式

时间:2016-07-06 06:40:08

标签: 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/ 45wuhrt//x/x/dsfhsdfs54uhb/ 5ehys//srt/fd/ab/cde/fg/x/x

期望的输出:

abc//a/123/gds:/4AdFg/f3dsg34/ yh//x/x/x/5Fsaf/x/

4 个答案:

答案 0 :(得分:2)

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:]]是unicode-safe。

可能的改进

一个问题是如何解释x。在上文中,x被允许为任何字符。然而,正如三联指出的那样,另一个合理的解释是x应该是除 /之外的任何字符。在那种情况下:

grep -E '[^/]*//[^/]*/[^/]*/[^/]*/[[:alnum:]]{5}/[^/]*/' file

另外,我们可能希望此正则表达式仅匹配完整行。在这种情况下,我们可以使用^$包围正则表达式,也可以使用grep' -x选项:

grep -xE '[^/]*//[^/]*/[^/]*/[^/]*/[[:alnum:]]{5}/[^/]*/' file

答案 1 :(得分:1)

您可以使用-P选项来扩展perl支持,例如

grep -P "^(?:[^/]*/){5}[A-Za-z0-9]{5}/(?:/|$)" input

<强> 输出

abc//a/123/gds:/4AdFg/f3dsg34/
yh//x/x/x/5Fsaf/x/

正则表达式细分

^ #Start of line
 (?: #Non capturing group
    [^/]* #Match anything except /
    / #Match / literally
 ){5} #Repeat this 5 times
 [A-Za-z0-9]{5} #Match alphanumerics. You can use \w if you want to allow _ along with [A-Za-z0-9]
 (?: #Non capturing group
   / #Next character should be /
    | #OR
   $ #End of line
 )

答案 2 :(得分:1)

我正在弄清楚如何在另一个答案的同时在awk中做到这一点并提出:

@Html.DropDownListFor(m => m.ItemID, new SelectList(ListSujet, "ID", "Value", "----Select----"), new { @class = "chosen-select" })

我制作的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' 正则表达式。

答案 3 :(得分:0)

使用sed和就地编辑删除所有不遵循特定模式的行(来自txt文件)

$ sed -i.bak -n "/.*\/\/.*\/.*\/.*\/[a-zA-Z0-9]\{5\}\/.*\//p" test.in
$ cat test.in
abc//a/123/gds:/4AdFg/f3dsg34/
yh//x/x/x/5Fsaf/x/

-i.bak到位编辑创建test.in.bak备份文件,-n安静,不要输出不匹配的输出 和".../p"打印匹配。