在文件B

时间:2016-07-28 14:12:56

标签: string bash sed substring

我目前有2个文件,文件A和文件B.文件A中的某些行包含文件B中某行的子字符串。我想用文件B中的相应字符串替换这些子字符串。

文件A的例子:

@Name_1
foobar
info_for_foobar
evenmoreinfo_for_foobar
@Name_2
foobar2
info_for_foobar2
evenmoreinfo_for_foobar2

文件B的示例:

@Name_1_Date_Place
@Name_2_Date_Place

我想要的输出:

@Name_1_Date_Place
foobar
info_for_foobar
evenmoreinfo_for_foobar
@Name_2_Date_Place
foobar2
info_for_foobar2
evenmoreinfo_for_foobar2

到目前为止我所拥有的:

我能够得到文件B中与文件A中的名称对应的名称的顺序。所以我想在这里使用一个while循环,它遍历文件B的每一行,然后查找并替换相应的子字符串在包含该行的文件A中,但是我不确定如何将其放入bash脚本中。

到目前为止我的代码是,但是没有提供所需的输出:

grep '@' fileA.txt > fileAname.txt

while read line
do
replace="$(grep '$line' fileB.txt)"
sed -i 's/'"$line"'/'"$replace"'/g' fileA.txt
done < fileAname.txt

有人有想法吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

您可以使用此脚本执行此操作:

awk 'NR==FNR {str[i]=$0;i++;next;} $1~"^@" {for (i in str) {if(match(str[i],$1)){print str[i];next;}}} {print $0}' B.txt  A.txt

答案 1 :(得分:0)

这个awk应该适合你:

awk 'FNR==NR{a[$0]; next} {for (i in a) if (index(i, $0)) $0=i} 1' fileB fileA

@Name_1_Date_Place
foobar
info_for_foobar
evenmoreinfo_for_foobar
@Name_2_Date_Place
foobar2
info_for_foobar2
evenmoreinfo_for_foobar2