使用 sed 传递参数

使用 sed 传递参数

对于我的脚本,我必须从文件中读取数据。

例如,我有 2 个文件:一个是文本文件,第二个是 10 列的 csv 文件。

我想做的是读取 csv 并更改第一个文件中的参数。

  1. 用于sed -n一次读取一行数据并将其保存在fileC
  2. 使用sed "s/&replacefile1param/&readFileC/g"

我遇到的问题是在第二步中读取catof作为参数。readFileC我怎样才能做到这一点?

第一个文件是一个示例脚本文件,内部有 2 个参数。第二个文件是一个 CSV 文件,有 200 行 6 列。

我需要通过读取 CSV 中的列并替换参数来更改模板文件。结果需要为 200 个 file1,并且每个结果也需要保存在 CSV 第 4 列中指定的位置。

示例模板文件

The name =scriptname

The staments go here

job name = jobname

exit

示例 CSV 数据

scriptname,jobname,date,location,updated,env
kkkkkk,filetest,2001-01-01,/san00/project,test
kkkkk2,filetest2,2001-01-01,/san00/project,test
kkkkk3,filetest3,2001-01-01,/san00/project2,real

我需要将模板文件中的参数替换为从 CSV 中获取的值,并将文件保存到/san00CSV 第 4 列的位置。

所需输出

The script name kkkkkk

The staments go here

job name = filetest

exit

这应该保存在san00/project.

答案1

file1是模板和file2csv。如果两行具有相同的位置,会发生什么,未定义,下面的解决方案将使用最新数据覆盖位置文件。我也不清楚该/san00目录是否是位置部分中唯一使用的目录以及它是否应该是绝对路径。

解决方案创建相对于当前目录的位置(注意.in.$dir.$location)。

while IFS=, read scriptname jobname date location updated env; do
    dir=$(dirname $location)
    [ -d .$dir ] || mkdir -p ".$dir"
    sed -e "s/scriptname/$scriptname/" \
        -e "s/jobname/$jobname/" file1 > ".$location"
done < <(tail -n +2 file2)

位置中使用绝对路径的解决方案,目标目录必须预先存在

while IFS=, read scriptname jobname date location updated env; do
    sed -e "s/scriptname/$scriptname/" \
        -e "s/jobname/$jobname/" file1 > "$location"
done < <(tail -n +2 file2)

提取 的信息的方法有很多种file2,上述只是其中一种,根据数据的性质,它可能比这更复杂。

答案2

这可能对你有用:

sed '1d;s|\([^,]*\),\([^,]*\),[^,]*,\([^,]*\).*|sed "1s/scriptname/\1/;5s/jobname/\2/" template >\3|' file.csv |
sh

相关内容