我在一个文本文件中有一个文本,我想要删除\{{[}
和{]}\}
删除字符串之间的所有内容,包括这些字符串本身。这两个字符串可以位于不同的行,也可以位于同一行。无论哪种情况,在开始的那一行上\{{[}
,我都不想删除它之前的文本,即左边的文本,而after之后的文本也是如此{]}\}
。
这是一个示例:给定一个带有内容的文本文件
Bla Bla bla bla \{{[} more bla bla
even more bla bla bla bla.
A lot of stuff might be here.
Bla bla {]}\} finally done.
Nonetheless, the \{{[} show {]}\} goes on.
该脚本应返回另一个包含内容的文本文件
Bla Bla bla bla finally done.
Nonetheless, the goes on.
不幸的是,这个简单的任务对我来说太难了sed
。我对使用任何语言的任何解决方案都感到满意,只要我不必在标准linux机器上安装任何东西(已经安装了C和一些Java)即可。
与perl
:
perl -0777 -pe 's/\Q\{{[}\E.*?\Q{]}\}\E//gs'
请注意,在处理之前,整个输入都已加载到内存中。
\Qsomething\E
是用于something
将被视为一个文字串,而不是正则表达式。
要就地修改常规文件,请添加以下-i
选项:
perl -0777 -i -pe 's/\Q\{{[}\E.*?\Q{]}\}\E//gs' file.txt
使用GNUawk
或mawk
:
awk -v 'RS=\\\\\\{\\{\\[}|\\{\\]}\\\\}' -v ORS= NR%2
在那里,我们定义的记录分隔为那些要么开始或结束标记(仅gawk
和mawk
支持RS
是一个正则表达式在这里)。但是,我们需要逃避是正则表达式运算符(反斜杠,人物{
,[
),并反斜杠一次,因为它在参数专用-v
(用于诸如\n
,\b
......),因此许多反斜杠。
然后,我们需要做的就是打印每隔一条记录。对于每个奇数记录NR%2
都是1
(true)。
对于这两种解决方案,我们都假定标记是匹配的,并且那些部分没有嵌套。
要使用GNU的最新版本就地修改文件awk
,请添加-i inplace
选项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句