我正在寻找一种方法来删除所有不遵循特定模式的行(来自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/
答案 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"
打印匹配。