Shell 在UNIX中使用sed的正则表达式

Shell 在UNIX中使用sed的正则表达式,shell,unix,sed,Shell,Unix,Sed,我想用sed替换变量。要替换,我需要知道文件中存在什么,所以我想用正则表达式提取那个字符串 $ cat file1.txt select * from ${database_name}.tab_name; 我想将${type\u database\u name\u env}转换成一个字符串,并使用sed replace命令将该变量替换为实际名称 sed -n 's/[${][a-z][_][a-z][_][a-z][_][a-z][}]/,/./p' file1.txt 我需要输出为 $ v

我想用sed替换变量。要替换,我需要知道文件中存在什么,所以我想用正则表达式提取那个字符串

$ cat file1.txt
select * from ${database_name}.tab_name;
我想将${type\u database\u name\u env}转换成一个字符串,并使用sed replace命令将该变量替换为实际名称

sed -n 's/[${][a-z][_][a-z][_][a-z][_][a-z][}]/,/./p' file1.txt
我需要输出为

$ var1=`sed command` # I am looking for proper sed command
$ echo $var1
${database_name}
使用grep,您可以使用

var1="$(grep -o '\${[^{}]*}' file1.txt | head -1)"
var1="$(sed -En 's/.*(\$\{[^{}]*}).*/\1/p' file"
| head-1用于在有更多比赛时取消第一场比赛

见:

见:

正则表达式详细信息

.*-匹配0个以上字符 \$\{[^{}]*}-在组1\1中捕获一个$char,后跟{,0+个字符,而不是{和},然后捕获一个} .*-匹配0个以上字符。
由于替换内容是对第1组文本的引用,因此sed完成其工作后,就剩下这些内容了。注意-E选项:它启用POSIX ERE语法,其中。。。用于指定捕获组,而不是\…\。

您可以使用awk:

$ awk -F'[ .]+' '{print $4}' file
${database_name}

请尝试var1=$sed-En的/*\$\{[^{}]*}.*/\1/p'文件,请参阅感谢您的快速响应它工作了!我使用了grep命令,效果很好。file_data=echo$file;val1=echo$file_data | grep-o'${.*}'我在答案中添加了grep解决方案。
f='select * from ${database_name}.tab_name;'
var1="$(sed -En 's/.*(\$\{[^{}]*}).*/\1/p' <<< $f)"
echo "$var1"
# => ${database_name}
$ awk -F'[ .]+' '{print $4}' file
${database_name}