使用bash动态替换具有env变量的模式

时间:2016-06-16 16:37:52

标签: regex bash awk sed

我的文件file.txt包含以下内容:Hi {YOU}, it's {ME}

我想像这样动态创建一个新文件file1.txt

YOU=John
ME=Leonardo
cat ./file.txt | sed 'SED_COMMAND_HERE' > file1.txt

哪些内容为:Hi John, it's Leonardo

我到目前为止尝试的sed命令就像这个s#{\([A-Z]*\)}#'"$\1"'#g但是“替换”部分无法正常工作,它打印出Hi $YOU, it's $ME

2 个答案:

答案 0 :(得分:1)

您可以将awk与2个文件一起使用。

$> cat file.txt
Hi {YOU}, it's {ME}

$> cat repl.txt
YOU=John
ME=Leonardo

$> awk -F= 'FNR==NR{a["{" $1 "}"]=$2; next} {for (i in a) gsub(i,a[i])}1' repl.txt file.txt
Hi John, it's Leonardo
  • 第一个awk命令会检索替换文件,并将每个键值存储在数组a中,并将{}包裹起来。
  • 在第二次迭代中,我们只需用实际文件中的值替换每个键。

<强>更新

要在不创建repl.txt的情况下执行此操作,您可以使用`process substitution **:

awk -F= 'FNR==NR{a["{" $1 "}"]=$2; next} {
   for (i in a) gsub(i,a[i])} 1' <(( set -o posix ; set ) | grep -E '^(YOU|ME)=') file.txt

答案 1 :(得分:1)

sed实用程序可以对每个输入行执行多项操作:

$ sed -e "s/{YOU}/$YOU/" -e "s/{ME}/$ME/" inputfile.txt >outputfile.txt

这假设{YOU}{ME}在线上只出现一次,否则,只需添加g"s/{YOU}/$YOU/g"等。)