好的,我是Unix脚本的新手。我被赋予了为此寻找临时工作的任务:
cat /directory/filename1.xml |sed -e "s/ABCXYZ/${c}/g" > /directory/filename2.xml
$ c是sqlplus计数查询中的变量。我完全理解这个sed命令是如何工作的。但这里是我被困的地方。我将与变量关联的计数存储在名为filename3的另一个文件中作为count [$ c],其中$ c被替换为数字。所以我的问题是如何更新此sed命令以使用来自file3的计数替换ABCXYZ?
更新:如果有人遇到类似问题,我可以使用以下方法: 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让我指出正确的方向答案 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)