所以我有两个文件file1和file2:
file1:
my name is xyz.
my name is abc.
I am a doctor.
I am an engineer.
I like dogs.
I like cats.
我想用较短的句子代替其中一些句子。所以我创建了另一个文件file2.csv
file2.csv:
"my name is xyz.","name xyz"
"my name is abc.","name abc"
"I am a doctor.","doctor"
"I like dogs.","dogs"
到目前为止,我已经使用了sed,如果在sed命令中单独输入所有这些行,它们就可以正常工作,但是file1和file2的内容可能会根据我的需要而改变,我需要一个不需要更改脚本的解决方案或代码。 类似于创建二维数组,然后检查file2的第一列中的值是否在file1中,然后将其替换为file2.csv的第二列中的相应条目。
因此,在我运行shell脚本文件1后,应该如下所示:
name xyz.
name abc.
doctor.
I am an engineer.
dogs.
I like cats.
请注意,文件1和文件2中的内容可以更改,也可以添加新条目,因此可以使用类似的
sed -i 's/I like dogs/dogs/' file1.csv
不可行。
答案 0 :(得分:2)
使用bash和sed:
sed -f <(sed 's|","|/|; s|"|/|g; s|^|s|' file2.csv) file1
输出:
name xyz name abc doctor I am an engineer. dogs I like cats.
点可能是一个问题,因为它是正则表达式中的特殊字符。
答案 1 :(得分:0)
使用awk
awk -F'"(,")?' '
NR==FNR { r[$2] = $3; next }
{ for (n in r) gsub(n, r[n]) } 1' file2.csv file1
-F'"(,")?'
是字段分隔符,与"
或","
匹配,因此我们不需要从字段中删除双引号,NR==FNR { r[$2] = $3; next }
使用完整句子作为键并将替换字符串作为值,使用内容为file2.csv
的数组填充{ for (n in r) gsub(n, r[n]) } 1
在每个输入记录中搜索每个完整句子,并将其替换为替换字符串。答案 2 :(得分:0)
简洁的红宝石脚本:
ruby -rcsv -e '
sentences = CSV.read(ARGV.shift).to_h
File.foreach(ARGV.shift, chomp: true) {|line| puts sentences[line] || line}
' file2.csv file1
答案 3 :(得分:0)
使用Perl One衬板。
$ cat file1
my name is xyz.
my name is abc.
I am a doctor.
I am an engineer.
I like dogs.
I like cats.
$ cat file2.csv
"my name is xyz.","name xyz"
"my name is abc.","name abc"
"I am a doctor.","doctor"
"I like dogs.","dogs"
$ perl -ne ' BEGIN {%kvp=map{chomp;s/\"//g;split "," } qx(cat file2.csv)} { chomp;print $kvp{$_}?"$kvp{$_}.\n":"$_\n"; } ' file1
name xyz.
name abc.
doctor.
I am an engineer.
dogs.
I like cats.
$