使用来自不同文件的sed替换

时间:2015-12-31 20:05:25

标签: shell unix sed

好的,我是Unix脚本的新手。我被赋予了为此寻找临时工作的任务:

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

$ c是sqlplus计数查询中的变量。我完全理解这个sed命令是如何工作的。但这里是我被困的地方。我将与变量关联的计数存储在名为filename3的另一个文件中作为count [$ c],其中$ c被替换为数字。所以我的问题是如何更新此sed命令以使用来自file3的计数替换ABCXYZ?

>>>>>>>>>>>>>>>>>>>>>>>&GT ;>>>>

更新:如果有人遇到类似问题,我可以使用以下方法: 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

谢谢Kaz让我指出正确的方向

2 个答案:

答案 0 :(得分:1)

使用语法filename3将计数存储在c=number中。然后,您可以将文件作为shell脚本来源:

. /filename3 # get c variable
sed -e "s/ABCXYZ/${c}/g" /directory/filename1.xml > /directory/filename2.xml

如果您无法更改filename3的格式,则可以编写一个shell函数,用于从该文件中删除该数字并设置c变量。或者您可以使用grep之类的外部程序来删除数字,然后使用命令替换将其输出内插到变量赋值中:$(command arg ...)语法。

假设我们可以依赖file3来恰好包含count[42]形式的一行。然后我们可以使用grep -o提取数字:

c=$(grep -E -o '[0-9]+' filename3)
sed -e "s/ABCXYZ/$c/g" /directory/filename1.xml > /directory/filename2.xml

当然可以消除c变量;您可以将$(grep ...)粘贴到sed命令行代替$c

包含各种变量的count[42]语法实例的文件可以使用sed转换为一组shell变量赋值,然后进入当前shell以进行这些赋值:

$ sed -n -e 's/^\([A-Za-z_][A-Za-z0-9_]\+\)\[\(.*\)\]/\1=\2/p' filename3 > vars.sh
$ . ./vars.sh

答案 1 :(得分:1)

你可以像这样使用sed

sed -r "s/ABCXYZ/$(sed -nr 's/.*count[[]([0-9])+[]].*/\1/p' path_to_file)/g" path_to_file

表达式是双引号,它允许shell在下面执行并在文件中找到count [$ c]中的数字并将其用作替换

$(sed -nr 's/.*count[[]([0-9])+[]].*/\1/p' path_to_file)