我需要使用 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 输出的一部分。