我知道也有人问过类似的问题,但我是一个新手,最近几个月才刚刚接触 Linux,我的问题的细节使我无法针对我的问题采用其他解决方案。
我希望用 CSV 中指示的特定匹配字符串替换单行中的不同字符串。
示例:文件1:
(((1[&label=1],2[&label=1])[&label=5]),3[&label=2])
file2.csv(两列 csv):
1[&label, "1[&tag=2,label"
2[&label, "2[&tag=5,label"
3[&label, "3[&tag=3,label"
我想在单行文件中用(等......)1[&label
替换,这样最终会得到:1[&tag=2,label
(((1[&tag=2,label=1],2[&tag=5,label=1])[&label=5]),3[tag=3,&label=2])
请注意,csv 不包含任何[&label
没有单独标签(1[&label
)的条目,但我[&label
在最终输出文件中仍然需要这些条目。
答案1
这是使用 Bash 的一种方法:
#!/bin/bash
# read the line to act upon
line=$(head -n 1 $1)
while read substitution
do
# get the first field, delimited by a comma
findvar=`echo $substitution | cut -d, -f1`
# remove the quotes and get the second field, delimited by a space
replacevar=`echo $substitution | sed 's/"//g' | cut -d' ' -f2`
# replace all occurrences of the find variable with the replacement
line=${line//$findvar/$replacevar}
done < $2
echo $line
如果这个脚本被命名为
substitute.sh
那么你可以打电话
sh substitute.sh file1 file2.csv
这是做出几个假设:
- 您的 CSV 格式与您描述的一致。在您的示例中,第一列中的值没有加引号,但第二列中的值加了引号。此外,该示例在分隔符后包含一个空格。如果实际的 CSV 格式不同,则需要调整脚本。
- 由于 CSV 中的替换是一次处理一个,因此后面的替换可能会与之前进行的替换相匹配。这可能不是你的本意。
例如,如果您的输入行是
foo bar baz
您的 CSV 文件替换为
foo, "bar"
bar, "baz"
您可能希望结果是
bar baz baz
但结果会是
baz baz baz