删除与模式不匹配的所有字符/单词

时间:2015-01-13 16:33:42

标签: regex awk sed vi

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

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

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

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

所有我发现有删除不包含模式的行,但是我没有找到任何与没有/ n(行尾)的大文件相关的内容。使用sed,awk或Vi?

可以做到这一点

谢谢!

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

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

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

编辑:此命令仅在stdout上输出想要的文本。要更改文件本身,请在调用perl时使用开关-i

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

创建备份文件,末尾附加扩展名.bak,结果写入与输入文件名同名的文件中。请注意,您不能仅使用swtich -i获取备份文件,但有些平台不允许这样做。有关详细信息,请参阅doc perlrun

答案 2 :(得分:1)

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

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