【问题标题】:grep regex to check if lines contains subdomaingrep 正则表达式检查行是否包含子域
【发布时间】:2019-01-05 05:50:45
【问题描述】:

我有一个包含域名的文件。我想搜索并删除子域的行。子域包含多个点 (.)。例子: 子域:ab.cd.fgab.cd.fg.hi。 完整域包含一个点:ab.cd

我不确定我的正则表达式是否正确以及是否会捕获任何子域,尽管点数很多:

grep '.\..(\..)+' myfile.csv

以上是我尝试搜索包含子域的行。如何删除它们并将新过滤的结果保存在新文件中?

示例输入:

ab.cd.fg
ab.cd
ab.cd.fg.hi.jk

输出应该是从带有子域的行中清除的文件,这些子域是带有一个点的行。

ab.cd

【问题讨论】:

  • 请在您的问题中添加示例输入和该示例输入所需的输出。
  • 据我了解,你想要grep -v '\..*\.'awk -F. 'NF==2' ...某处有重复..
  • 您的要求不完整。 yahoo.co.ukpoughkeepsie.k12.ny.us 是各自层次结构中的顶级域。

标签: regex string ubuntu search grep


【解决方案1】:

这样就可以了:

grep -P '^[^.]+\.[^.]+$' input_file

在哪里

  • -P : perl 正则表达式
  • ^ : 行首
  • [^.]+ : 1 个或多个任何不是点的字符
  • \.:一个点
  • [^.]+ : 1 个或多个非点字符
  • $ : 行尾

【讨论】:

  • 此正则表达式中的任何内容都不需要-P 选项,这是非标准的,因此不完全可移植。只需放弃该选项。
  • @tripleee:没有-P,它对我不起作用。 (Virtualbox 中的 Linux Mint)
  • 你需要-E,或者反斜杠加号。 -E 选项在 POSIX 中定义,可广泛移植。但是,是的,抱歉,我忽略了您使用 +(在 egrep 中引入)而不是 *(在 Thompson 的原始 grep 中)这一事实。
  • @tripleee:好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2021-01-06
  • 1970-01-01
  • 2012-11-26
相关资源
最近更新 更多