我有一个没有行的文字,我想删除所有与模式不匹配的字符:
模式将来自word参数,直到找到}}
。例如,如果我有这个条目:
KHJLMNNamespaceparameter:{{"Hello i am here"}}NamespaceHSKFSAFSLLLJparameter:{{H}}...
我想删除所有内容并将其保留在文件中:parameter:{{"Hello i am here"}} parameter:{{H}}
。
所有我发现有删除不包含模式的行,但是我没有找到任何与没有/ n(行尾)的大文件相关的内容。使用sed,awk或Vi?
可以做到这一点谢谢!
答案 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}}