我想用shell編程制作一個程式編輯檔案代碼
有命令“在算術擴展 $(()) 中洗掉 ${}” ,我在實作中遇到問題。
我將在下面制作 bash shell 代碼
cnt=$(( ${cnt} ${cnt123} ))
至
cnt=$(( cnt cnt123 ))
我想洗掉算術擴展括號中的命令替換括號
我嘗試使用這個正則運算式:
sed -Ei 's/(\$\(\()([^\)]*?)\$\{([^\}] ?)\}(.*?)(\)\))/\1\2\3\4\5/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
uj5u.com熱心網友回復:
由于 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 替換用 perl
s/pattern/expression/e替換匹配 項pattern,expression而不是文字(或固定)替換。您可以使用此機制執行動態替換。 (?<=\$\(\(). ?(?=\))匹配前面$((和后面的子字串))。那么匹配的子字串將是$(( .. )). perl 變數$&被分配給它。- 該運算式
$_ = $&; s#\$\{(. ?)}#$1#g; $_是一個 perl 代碼,用于從上面的匹配子字串中洗掉配對${和}。分隔符后的g選項#與sed.
uj5u.com熱心網友回復:
根據背景關系,您可能希望將匹配范圍限制為僅字母數字字符
sed -Ei.bak 's/\$\{([[:alnum:]] )\}/\1/g'
以避免無意中匹配其他內容。
uj5u.com熱心網友回復:
使用sed
$ sed -Ei.bak 's/\$\{([^}]*)}/\1/g' input_file
cnt=$(( cnt cnt123 ))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512821.html
上一篇:合并兩個檔案AWK
下一篇:`bash-`有什么作用?
