shell 使用sed删除算术形式

dsekswqp  于 2022-11-16  发布在  Shell
关注(0)|答案(3)|浏览(133)

我想使用sed删除文件中算术形式中的${},例如abc=$((${var}+3))toabc=$((var+3))
我在sed中使用了位置交换,类似于

sed -E 's/(\w+\W\$\(\( ) (\$\{) (\w+) (\}) (.*)/\1 \3 \5/g file.txt'

但当我使用abc=3时,它只提取abc=3

echo abc=$((( ${var}+3 )) | sed -E 's/(\w+\W\$\(\( ) (\$\{) (\w+) (\}) (.*)/\1 \3 \5/'

在终端,只是为了检查它是否工作正常
并且它对shell脚本没有任何作用,我如何只删除文件的${}部分?
我用的是Mac OS,也试过Ubuntu,但还是一样

f87krz0w

f87krz0w1#

使用sed

$ sed -E 's/\$\{([^}]*)}/\1/' input_file
abc=$(( var+3 ))
uurv41yg

uurv41yg2#

***第一个解决方案:***此处使用捕获组概念,并使用捕获值替换匹配值,并且仅使用必需得值,请尝试以下sed代码.以下是sed代码中使用得正则表达式得Online Demo.

s='abc=$(( ${var}+3 ))' ##shell variable
sed -E 's/^([^=]*=\$\(\( )\$\{([^}]*)}(.*)$/\1\2\3/' <<<"$s"

***或***如果您有一个要替换值的Input_file,请使用以下命令。

sed -E 's/^([^=]*=\$\(\( )\$\{([^}]*)}(.*)$/\1\2\3/' Input_file

***第二个解决方案:***使用Perl的一行程序方法(使用Lazy match regex),可以尝试以下方法,使这里的工作更简单。

perl -pe 's/^(.*?)\$\{(.*?)\}(.*)$/$1$2$3/' Input_file
8cdiaqws

8cdiaqws3#

printf="abc=\$(( \${var}+3 )) to abc=\$(( var+3 ))" | tr -d '{' | tr -d '}'

相关问题