我想用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 试图解释变量而得到一个错误。