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

时间:2019-04-02 13:08:04

标签: shell unix sed

我想使用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}

2 个答案:

答案 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}