Bash 我怎样才能严格地复习两个课时?

Bash 我怎样才能严格地复习两个课时?,bash,sed,grep,Bash,Sed,Grep,我有一个域列表,但有些域以重复的形式出现,例如: boy.or.uk man.me.uk admin.man.me.uk root.man.me.uk girl.co.uk woman.co.uk mail.woman.co.uk www.woman.co.uk youtube.co.uk 您可以看到woman.co.uk和man.me.uk多次出现。我想把它过滤掉,只留下它 boy.or.uk man.m

我有一个域列表,但有些域以重复的形式出现,例如:

    boy.or.uk
    man.me.uk
    admin.man.me.uk
    root.man.me.uk
    girl.co.uk
    woman.co.uk
    mail.woman.co.uk
    www.woman.co.uk
    youtube.co.uk
您可以看到woman.co.uk和man.me.uk多次出现。我想把它过滤掉,只留下它

    boy.or.uk
    man.me.uk
    girl.co.uk
    woman.co.uk
    youtube.co.uk

这是我最接近的一次。问题在于,它包含了所有具有两个或以上周期的内容。我基本上是在寻找一个bash-one行,确保行以.uk结尾,并过滤掉子域或一个greps严格为2个句点的行。谢谢

我想说这样的话:

grep -E "^([^.]+\.){2}uk$" <infile> | sort -u
grep-E“^([^.]+\){2}uk$”| sort-u

grep-E
regex将只匹配以
uk
结尾的两个句点分隔的3个单词的行,并且
sort-u
将确保唯一性。

我会这样做:

grep -E "^([^.]+\.){2}uk$" <infile> | sort -u
grep-E“^([^.]+\){2}uk$”| sort-u

grep-E
regex将只匹配以
uk
结尾的两个句点分隔的3个单词的行,
sort-u
将确保唯一性。

您可以使用awk代替:

awk -F'.' '(NF==3) && ($NF=="uk")' file
以上确保有3个
分隔的字符串(如果输入中有2个
),最后一个是
uk
。如果要确保唯一性,这只是一个额外的调整:

awk -F'.' '(NF==3) && ($NF=="uk") && !seen[$0]++' file

您可以改用awk:

awk -F'.' '(NF==3) && ($NF=="uk")' file
以上确保有3个
分隔的字符串(如果输入中有2个
),最后一个是
uk
。如果要确保唯一性,这只是一个额外的调整:

awk -F'.' '(NF==3) && ($NF=="uk") && !seen[$0]++' file
使用sed和BRE:

sed 's/^\( *\).*\.\(.*\..*\.\uk)/\1\2/' file | sort -u
编辑:

添加了带有sed和BRE的
.uk
过滤器。

sed 's/^\( *\).*\.\(.*\..*\.\uk)/\1\2/' file | sort -u
编辑:


添加了
.uk
过滤器。

还添加了
^[^.]+\.[^.]+\.uk$
,OP也提到了
确保行的结尾是有问题的.uk
详细信息是否应转义括号内的句点[^\.]不,这在字符类中很好-
[.]
表示“文字句点字符”,因此,很自然地,
[^.]
表示“任何不是文字句点字符的内容”。也可以添加
^[^.]+\.[^.]+\.uk$
,正如OP也提到的
确保行的结尾是有问题的.uk
详细信息是否应转义括号内的句点[^.]?不,在字符类中可以-
[.]
表示“文字句点字符”,因此,很自然,
[^.]
表示“任何不是文字句点字符的内容”。如果输入包含一行
csc.cam.ac.uk
,则不会打印该行。。也许这就是op所说的要求,或者严格来说是两个句号。但我不确定这是他们打算做的。是的,这正是要求,只打印正好包含两个句号并以
uk
结尾的行。请参阅OPs问题中的预期输出。感谢您的回答。出于好奇,如果列表中包含了
csc.cam.ac.uk
,并且您希望在结果中包含
cam.ac.uk
,您将如何处理@sjsam需求?这一切都取决于导致转换的需求是什么,以及您的全套可能输入可能喜欢什么,但类似于
awk-F.”{$0=gensub*(([^.]+\.{2}[^.]+$/,“\\1”,1)}(NF==3)&($NF==uk)和&!SEED[$0]+'文件
可能就是您想要的。它将GNU awk用于gensub()。如果输入中包含一行
csc.cam.ac.uk
,则不会打印该行。。也许这是op所说的
要求,或者是一个严格为两个句点进行greps的要求。
但我不确定这是他们打算做的。是的,这正是要求,只打印包含两个句点且以
结尾的行>uk
。查看OPs问题中的预期输出。感谢您的回答。出于好奇,如果列表中包含了
csc.cam.ac.uk
,并且您希望在结果中包含
cam.ac.uk
,您将如何处理@sjsam需求?这一切都取决于导致转换的需求是什么,以及您的完整需求是什么一组可能的输入只能像
awk-F.''{$0=gensub(/.*([^.]+\.{2}[^.]+)$/,“\\1”,1)}(NF==3)&($NF==“uk”)&!seed[$0]+'文件
可能是您想要的。它使用GNU awk表示gensub()。