删除文件中模式之间出现的所有字符

时间:2013-01-23 21:31:04

标签: linux bash shell

我有一个文件,其中包含PHP代码到TWIG的错误翻译,我只需要删除括号()的第一个和最后一个出现以及{%和%}标记之间包含的任何出现的$

例如,如果在文件中有:

{% if($var.has($something)) %}
This symbols ($($)$) won't be deleted becoase they aren't between {% and %}

我需要将其转化为:

{% if var.has( something) %}
This symbols ($($)$) won't be deleted becoase they aren't between {% and %}

关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:1)

当涉及语法时,我喜欢使用vim来执行该任务。在你的情况下:

vim -c'%g / {%/ norm /(^ [ma%x`ar'file

说明: - vim -c - 运行命令

  • %g - 每行
  • / {% - 包含模式{%
  • norm - entrer vim normal mode
  • /( - 转到(
  • ^ { - ESC(按CTRL + V<由ESC跟进)
  • ma - 将当前位置标记为“a”
  • % - 转到匹配结束)
  • x - 将其删除
  • `a - 回到(
  • r - 将其替换为空格

答案 1 :(得分:0)

您需要多高的准确度?如果您在一行中没有多个{%%} {%%}(或者您可以s/%}/&\n/g来阻止这种情况),您可以使用可怕的丑陋

sed -e ':s; s/{%\(.*\)\$\(.*\)%}/{%\1\2%}/; ts; s/{%\([^(]*\)(\(.*\))\(.*\)%}/{%\1 \2 \3%}/'

删除$内的所有{% %},然后删除最外面的括号(

)。