使用 sed 和循环将文件作为参数传递

使用 sed 和循环将文件作为参数传递

这里 File1 是模板。文件 2 是一个 csv,有 200 行,其中包含脚本名称、作业名称、模板名称、位置列
。模板名称是文件 2 中的列。

是否可以按如下方式进行。目的是为 file2 中的不同行使用不同的模板(file1 的)。感谢任何帮助
$templatename 我想更改飞行 2 行。这可能吗?以下内容不起作用:

  • 样本文件1

scriptname

statments go here

change jobname

保存在位置文件夹中(已经存在)

  • 样本文件2

scriptname, jobname, templatename, location

qqqtest,sew-test,/san00/test/file1, /san00/test/

qqqtest,sew-test,/san00/test/file2, /san00/test/

我希望每次通过读取 csv 进行以下更新来更改 file1、file2 模板等?

while IFS=, read scriptname jobname templatename location; 
do sed -e "s/scriptname/$scriptname/" \
  -e "s/jobname/$jobname/" $templatename > "$location" 
done < (file2) 

如何更新 $templatename?

答案1

我不确定我明白你想要什么,但我可以看到一些可能需要修复的事情。

IFS=, read scriptname jobname templatename location读取逗号分隔值。在 中file2,有时逗号周围有空格。空格最终会出现在变量中。如果字段内从不存在任何空格,则设置IFS=', '为将由可选空格或任何空格序列包围的任何一个逗号序列视为分隔符。如果字段内可以有空格但不能在开头或结尾,我建议file2首先进行预处理:

<file2 sed -e 's/^  *//' -e 's/ *, */,/g' -e 's/  *$//' | while IFS=, read …; do …; done

顺便说一句,<(file2)在某些 shell 中, 是语法错误,而在其他 shell 中,这意味着这file2是要执行的命令(进程替换)。你的意思是<file2

/如果脚本名称或作业名称中可以有 a ,它将最终出现在sed命令中并导致 sed 语法错误。由于 by 构造的任何字段中都不能有逗号file2,因此请使用,seds命令分隔符:

sed -e "s,scriptname,$scriptname," -e 's,jobname,$jobname,' …

在您的示例数据中,该位置是一个目录,但在您的代码中,您尝试将输出写入其中。如果位置是目录,则需要提供文件名。如果您想使用与$templatename位置为目录时相同的文件名,可以执行以下操作:

if [ -d "$location" ]; then
  location="$location/${templatename##*/}"
fi

这些文件$location$templatename不能是同一个文件,否则sed … "$templatename" >"$location"将首先截断该文件,然后开始从中读取。为了允许文件相同的可能性,请将 sed 输出写入临时文件,然后将其移动到位。如果你有mkstemp

location_dir=${location%/*}
tmp=$(TMPDIR=$location_dir mktemp -t)
sed … >"$tmp"
mv -f -- "$tmp" "$location"

相关内容