Linux 删除文件中模式之间某些字符的所有引用

Linux 删除文件中模式之间某些字符的所有引用,linux,bash,shell,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 ($($)$)

我有一个文件,其中包含一个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 %}

你知道怎么做吗?

你需要多精确?如果在一行上没有多个{%%}{%%}(或者如果可以
s/%}/&\n/g
来防止这种情况发生),那么可以使用非常丑陋的

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

它删除
{%}
中的所有
$
,然后删除最外面的括号(如果有)。

当涉及语法时,我喜欢使用
vim
执行该任务。就你而言:

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

说明: -vim-c-run命令

  • %g-每行
  • /{%-包含模式{%
  • 正常-中心vim正常模式
  • /(-转到(
  • ^{-ESC(按CTRL+V<然后按ESC)
  • ma-将当前位置标记为“a”
  • %-转到匹配结束)
  • x-移除它
  • `回到(
  • r-将其替换为空间

非常感谢,这正是我想要的。现在我正在煮一杯非常大的咖啡,让我忍不住想知道这个可怕的命令是如何运作的:谢谢你的回答,但我需要一个像“那个家伙”这样的命令分享在bash脚本中完成的工作。除了教授Vim的命令之外,还感谢您,这是我学习TODO的一部分