l7l*_*ll7 5 sed awk perl text-processing
我有一个文本文件,在这里我想要的一切就是琴弦之间喜欢文字\{{[}和{]}\}要删除-包括这些字符串本身。这两个字符串可以位于不同的行上,也可以位于同一行上。在任何一种情况下, 在开头\{{[}所在的行上,我都不希望删除它之前的文本,即左边的文本 - 之后的文本也是如此{]}\}。
这是一个例子:给定一个包含内容的文本文件
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.
Run Code Online (Sandbox Code Playgroud)
脚本应该返回另一个包含内容的文本文件
Bla Bla bla bla finally done.
Nonetheless, the goes on.
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个看似简单的任务对我来说太难了sed。我对任何语言的任何解决方案都感到满意,只要我不必在我的标准 linux 机器上安装任何东西(C 和一些 java 已经安装)。
与perl:
perl -0777 -pe 's/\Q\{{[}\E.*?\Q{]}\}\E//gs'
Run Code Online (Sandbox Code Playgroud)
请注意,整个输入在处理之前已加载到内存中。
\Qsomething\E用于something将其视为文字字符串而不是正则表达式。
要就地修改常规文件,请添加-i选项:
perl -0777 -i -pe 's/\Q\{{[}\E.*?\Q{]}\}\E//gs' file.txt
Run Code Online (Sandbox Code Playgroud)
使用 GNUawk或mawk:
awk -v 'RS=\\\\\\{\\{\\[}|\\{\\]}\\\\}' -v ORS= NR%2
Run Code Online (Sandbox Code Playgroud)
在那里,我们定义的记录分隔为那些要么开始或结束标记(仅gawk和mawk支持RS是一个正则表达式在这里)。但是我们需要再次转义正则表达式运算符(反斜杠、{, [)和反斜杠的字符,因为它在参数中很特殊-v(用于诸如\n, \b... 之类的东西),因此有许多反斜杠。
然后我们需要做的就是打印所有其他记录。对于每个奇数记录NR%2都是1(真)。
对于这两种解决方案,我们假设标记匹配并且那些部分没有嵌套。
要使用最新版本的 GNU 就地修改文件awk,请添加该-i inplace选项。