删除所有与模式不匹配的 characters/words

Delete all characters/words that doesn't match a pattern

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

模式将从单词参数开始,直到找到 }}。例如,如果我有这个条目:

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

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

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

谢谢!

如果 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

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

grep -oP '.*?\Kparameter:\{\{.*?\}\}' file
parameter:{{"Hello i am here"}}
parameter:{{H}}
$ awk 'BEGIN{RS=ORS="}}"} sub(/.*parameter/,"parameter")' file
parameter:{{"Hello i am here"}}parameter:{{H}}

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