【问题标题】:Removing lines that don't contain certain text删除不包含特定文本的行
【发布时间】:2018-03-15 01:53:37
【问题描述】:

我有一个包含大量域的文本文件。我想删除所有不是这些扩展之一的域:

.com
.net
.org
.biz
.us

我尝试了几种方法,但似乎没有任何效果。我遇到的主要问题是某些行没有被删除。

例如,以.com.br 结尾的域不会被删除,因为它们的行中有.com,但我实际上希望它们被删除...

如果这是文件:

test.com
example.com.br
testing.net

那么它应该变成这样:

test.com
testing.net

似乎应该有一种方法可以使用sed 做到这一点,但我就是无法让它工作:/

这是我尝试做的:

sed '/.com$\|.net$\|.org$\|.biz$\|.us$/!d' *.txt

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 刚刚添加了我最近尝试的方式:sed '/.com$\|.net$\|.org$\|.biz$\|.us$/!d' *.txt
  • 我认为你做得很好,只需将-r 标志提供给sed

标签: linux bash shell command-line terminal


【解决方案1】:

不确定,您是否可以在您的环境中使用awk,并使用实际数据,因为下面的给定输入应该可以工作:

$ cat domain_ext_file 
.com
.net
.org
.biz
.us

$ cat site_list 
test.com
example.com.br
testing.net

$ awk -F'.' 'FNR==NR{a[$NF];next}$NF in a' domain_ext_file site_list 
test.com
testing.net

说明:

  • 将字段分隔符设置为点(.),将domain_ext_file中的最后一个字段($NF)存储在数组a中,转到下一行
  • 在读取第二个文件 (site_list) 时,如果数组 a 的键/索引是第二个文件的最后一个字段 ($NF in a),则打印这样的行/记录/行

【讨论】:

    【解决方案2】:

    使用grep:

    grep  '\.\(com\|net\|org\|biz\|us\)$'
    

    如果您的版本支持,使用扩展正则表达式更具可读性:

    grep  -E '\.(com|net|org|biz|us)$'
    

    【讨论】:

      【解决方案3】:

      我看到您没有粘贴您正在使用的确切输入,但这应该可以正常工作。

      ubuntu$ cat  text.txt
      .com
      .net
      .org
      .biz
      .us
      .com.br
      .mlp
      .grrr
      
      ubuntu$ grep -E  '[.]com$|[.]net$|[.]org$|[.]biz$|[.]us$' text.txt
      .com
      .net
      .org
      .biz
      .us
      

      问候!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多