使用 sed 从 1 个文件中检索变量并将其放入另一个文件中

使用 sed 从 1 个文件中检索变量并将其放入另一个文件中

我需要使用 sed 检索文件名中的变量形式。我正在更新以前的代码:

cat /directory/filename1.xml | sed -e "s/XYZABC/${c}/g" > /directory/filename2.xml

的值${c}在另一个文件中,并且每天都会发生变化。我如何使用 sed 执行此操作?

这是一些额外的背景信息。对于最初未能将其包含在内,我深表歉意。${c}是一个sqlplus变量,用于存储查询的计数。我需要从文件中检索该计数。它保存在文件中,其中Count=[$c]成为[$c]查询的计数。我需要$c替换第一个 xml 文件中的 XYZABC 并将结果保存到新的 xml 文件中。


更新:如果有人遇到类似的问题,我可以使用以下方法来工作:

rm /directory/folder/variablefilename.dat
echo $c >> /directory/folder/variablefilename.dat

d=$(grep [0-9] /directory/folder/variablefilename.dat)

sed -3 "s/ABC123/${d}/g" /directory/folder/inputfile.xml >> /directory/folder/outputfile.xml

答案1

通常,如果您想使用 sed(或 perl、ruby)修改文件,则添加该-i选项。假设我们正在讨论 XML 中的属性分配:

changeit() {
  let newval="$1"
  shift; 
  # "$@" now contains all filenames
  sed -i -e 's/(XYZABC[[:space:]]*=[[:space:]]*)"([^"]*)"/\1"'"$newval"'";/' "$@"
}

changeit happy-happy /directory/filename1.xml

在测试之前,请对目录/文件进行备份,然后进行比较。sed -i可能具有很大的破坏性。

请注意,这对每行应用一次替换。每个文件查看一次其他问题/答案。对于每行多次,请g在最后一个斜杠 ( /) 之后添加。

引用规则的解释:我假设格式良好的 XML 将属性值封装在双引号中。所以我们正在寻找VARNAME = "something".只要这样就有效某物本身不包含转义双引号字符。因此我们必须在 shell 中保留双引号,为此我们使用单引号。这样做可以防止变量$newval被插值。因此,我们必须在变量扩展之前关闭命令的引用部分,然后扩展$newval,现在应该用双引号引起来,以防止 shell 认为嵌入空格为 sed 启动一个新参数(以及文件名),然后恢复单引号,以便我们可以替换双引号作为 sed 输出的一部分。

相关内容