我想使用sed替换变量。要替换,我需要知道文件中存在什么,因此我想使用正则表达式提取该字符串。
$ cat file1.txt
select * from ${database_name}.tab_name;
我想将${type_database_name_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}
答案 0 :(得分:1)
使用grep
,您可以使用
var1="$(grep -o '\${[^{}]*}' file1.txt | head -1)"
| head -1
用于提取第一个匹配项,以防万一。
请参见online demo:
f='select * from ${database_name}.tab_name;'
var1="$(grep -o '\${[^{}]*}' <<< "$f" | head -1)"
echo "$var1"
使用sed
,您可以使用
var1="$(sed -En 's/.*(\$\{[^{}]*}).*/\1/p' file"
请参见online demo:
f='select * from ${database_name}.tab_name;'
var1="$(sed -En 's/.*(\$\{[^{}]*}).*/\1/p' <<< $f)"
echo "$var1"
# => ${database_name}
正则表达式详细信息
.*
-匹配0个以上的字符(\$\{[^{}]*})
-将\1
字符与后跟$
,第0个字符(除{
和{{1}之外)捕获到组1({
)中},然后是}
}
-匹配0个以上的字符。由于替换项是对第1组文本的引用,因此.*
执行完此操作后便保留了所有内容。请注意sed
选项:它启用POSIX ERE语法,其中-E
用于指定捕获组,而不是(...)
。
答案 1 :(得分:0)
您可以只使用awk:
$ awk -F'[ .]+' '{print $4}' file
${database_name}