如何使用 sed 删除嵌套括号中的多个括号?



我想用shell编程制作一个程序编辑文件代码

算术扩展中有命令"删除${}$())">我在实现中遇到了问题。

我将在下面制作 bash shell 代码

cnt=$(( ${cnt} + ${cnt123} ))

cnt=$(( cnt + cnt123 ))

我想删除算术扩展括号中的命令替换括号

我尝试使用这个正则表达式:

sed -Ei 's/($(()([^)]*?)${([^}]+?)}(.*?)()))/12345/g' $file

但是,它只是找到了一个最长的。(即使匹配之前还有另一场比赛)

如果要查看可视化的正则表达式,请单击此链接可视化图像

结果显示如下:

cnt=$(( ${cnt} + cnt123 ))

如何移除嵌套支架中的内部支架? (我应该只使用 awk 或 sed,但如果不可能,使用其他 bash 命令没关系)


工作示例:

s=$(( ${s} ** 2 ))s=$(( s ** 2 ))

sum=$(( ${a} + ${b} ))sum=$(( a + b ))

echo $(( (${var} * ${var2}) / ${var3} ))echo $(( (var * var2) / var3 ))

echo ${d} $((${t1} + ${t2})) ${e}echo ${d} $(( t1 + t2 )) ${e}


:我的示例输入文件(它的作用无关紧要)

#! /bin/bash
cnt=0
cnt123=1
for filename in *
do
fname=$(basename $filename)
cname=$(echo $fname | tr A-Z a-z)
if [ "$fname" !=  "$cname" ] 
then
if [ -e "$cname" ]
then 
echo "$cname already exists"
exit 1
fi
echo "$fname is renamed $cname"
mv $fname $cname
cnt=$(( ${cnt}+ ${cnt123} ))
fi
done
echo "Total count: $cnt"
exit 0

由于对于 sed/awk 正则表达式和相关函数来说,这不是一件容易的事, 请让我展示一个perl的解决方案,尽管perl没有标记在 你的问题。

perl -i -pe 's/(?<=$(().+?(?=)))/ $_ = $&; s#${(.+?)}#$1#g; $_ /ge' "$file"

输入文件示例:

s=$(( ${s} ** 2 ))
sum=$(( ${a} + ${b} ))
echo $(( (${var} * ${var2}) / ${var3} ))
echo ${d} $((${t1} + ${t2})) ${e}

修改后的结果:

s=$(( s ** 2 ))
sum=$(( a + b ))
echo $(( (var * var2) / var3 ))
echo ${d} $((t1 + t2)) ${e}
  • perl 替换s/pattern/expression/e替换匹配的pattern使用 perlexpression而不是文字(或固定) 更换。您可以使用此机制执行动态替换。
  • (?<=$(().+?(?=))匹配前面带有$((的子字符串 并跟随)).然后匹配的子字符串将是其中的内容$(( .. )).perl 变量$&被分配给它。
  • 表达式$_ = $&; s#${(.+?)}#$1#g; $_是要删除的 perl 代码 配对的${}来自上面匹配的子字符串。g选项 在分隔符之后#sed.

根据上下文,您可能希望将匹配范围限制为仅字母数字字符

sed -Ei.bak 's/${([[:alnum:]]+)}/1/g'

以避免无意中匹配其他内容。

使用sed

$ sed -Ei.bak 's/${([^}]*)}/1/g' input_file
cnt=$(( cnt + cnt123 ))
printf="cnt=$(( ${cnt} + ${cnt123} ))" | tr -d '{' | tr -d '}'

我在这里使用了printf,因为它比echo更值得信赖。 确保你转义$,否则你会因为 bash 试图解释变量而得到一个错误。

相关内容

  • 没有找到相关文章

最新更新