【问题标题】:Delete all characters/words that doesn't match a pattern删除所有与模式不匹配的字符/单词
【发布时间】:2015-03-11 16:38:19
【问题描述】:

我有一个没有线条的文本,我想删除所有与模式不匹配的字符:

模式将来自 word 参数,直到找到 }}。例如,如果我有这个条目:

KHJLMNNamespaceparameter:{{"Hello i am here"}}NamespaceHSKFSAFSLLLJparameter:{{H}}...

我想删除所有内容并将其保留在文件中:parameter:{{"Hello i am here"}} parameter:{{H}}

我在那里发现的只是删除不包含模式的行,但我无法找到与没有 /n(行尾)的大文件相关的任何内容。可以使用 sed、awk 或 Vi 来做到这一点吗?

谢谢!

【问题讨论】:

    标签: regex awk sed vi


    【解决方案1】:
    $ awk 'BEGIN{RS=ORS="}}"} sub(/.*parameter/,"parameter")' file
    parameter:{{"Hello i am here"}}parameter:{{H}}
    

    请注意,由于多字符 RS,这是 gawk 特有的。

    【讨论】:

      【解决方案2】:

      如果perl 是一个选项,您可以这样做:

      perl -ne "my @wo = ($_ =~ /parameter:\{\{.*?\}\}/g); print join(' ',@wo);" your_text_file
      

      在 perl 中,修饰符 *? 是一个非贪婪量词,因此它会在第一次遇到 }} 时停止。

      我认为 perl 专家可以在一条指令中完成此操作,而无需临时数组...

      EDIT:这个命令只在标准输出上输出想要的文本。要更改文件本身,请在调用 perl 时使用开关 -i

      perl -i.bak -ne "my @wo = ($_ =~ /parameter:\{\{.*?\}\}/g); print join(' ',@wo);" your_text_file
      

      会创建一个备份文件,并在末尾附加扩展名 .bak,并将结果写入与输入文件名同名的文件中。请注意,您无法单独使用 swtich -i 获得备份文件,但某些平台不允许这样做。请参阅doc perlrun 了解更多信息。

      【讨论】:

      • 我刚刚测试过,但它不起作用......无论如何,谢谢!
      • 为我工作,输出和你想要的一样。您能否更准确地说明错误/失败?你用的是哪个版本的perl?我的是 5.20.1
      • 它只是不打印任何输出。我所做的只是你在 macOSX 终端上的命令 perl -ne "my @wo = ($_ =~ /parameter:\{\{.*?\}\}/g); print join(' ',@ wo);" output.txt ,但它不打印任何东西...我的 perl 版本是 5.16.0
      • @iOSAddicted 只是说“它不起作用”距离有用的反馈还有很长的路要走,让我们零机会尝试帮助您找出问题所在。如果您需要帮助,请付出一点努力来帮助我们为您提供帮助。
      • 使用 -i.bak 创建和 output.txt.bak,其输出与我的 output.txt 文件的输入完全相同。很抱歉之前没有提供更多详细信息...
      【解决方案3】:

      您可以将此grep-P (PCRE) 正则表达式一起使用:

      grep -oP '.*?\Kparameter:\{\{.*?\}\}' file
      parameter:{{"Hello i am here"}}
      parameter:{{H}}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-12
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        • 1970-01-01
        相关资源
        最近更新 更多