我有两个文件,fileA,其中包含名称列表:
AAAAA
BBBBB
CCCCC
DDDDD
和另一个带有另一个列表的fileB:
111
222
333
444
和第三个带有一些文字的文件C:
Hello AAAAA toto BBBBB dear "AAAAA" trird BBBBBB tuizf AAAAA dfdsf CCCCC
所以我需要通过fileB模式找到并替换fileC中fileA的每个模式。 有用 !但我意识到fileC包含像“AAAAA”这样的词,它不会被“111”取代。
我这样做但似乎没有效果。
#! /bin/bash
while IFS= read -r lineA && IFS= read -r lineB <&3; do
sed -i -e "s/$lineA/$lineB/g" fileC
done <fileA 3<fileB
答案 0 :(得分:3)
GNU awk
这是一个很好的工作:
$ cat replace.awk
FILENAME=="filea" {
a[FNR]=$0
next
}
FILENAME=="fileb" {
b[a[FNR]]=$0
next
}
{
for (i=1;i<=NF;i++) {
printf "%s%s",(b[$i]?b[$i]:$i),(i==NF?RS:FS)
}
}
演示:
$ awk -f replace.awk filea fileb filec
Hello 111 toto 222 dear 111 trird BBBBBB tuizf 111 dfdsf 333
sehe的解决方案:
FILENAME==ARGV[1] { # Read the first file passed in
find[FNR]=$0 # Create a hash of words to replace
next # Get the next line in the current file
}
FILENAME==ARGV[2] { # Read the second file passed in
replace[find[FNR]]=$0 # Hash find words by the words to replace them
next # Get the next line in the current file
}
{ # Read any other file passed in (i.e third)
for (i=1;i<=NF;i++) { # Loop over all field & do replacement if needed
printf "%s%s",(replace[$i]?replace[$i]:$i),(i==NF?RS:FS)
}
}
对于替换忽略单词边界:
$ cat replace.awk
FILENAME==ARGV[1] {
find[FNR]=$0
next
}
FILENAME==ARGV[2] {
replace[find[FNR]]=$0
next
}
{
for (word in find)
gsub(find[word],replace[find[word]])
print
}
演示:
$ awk -f replace.awk filea fileb filec
Hello 111 toto 222 dear "111" trird 222B tuizf 111 dfdsf 333
答案 1 :(得分:2)
sed 's/.*/s/' fileA | paste -d/ - fileA fileB | sed 's/$/\//' | sed -f - fileC
正确且更快的版本将是
paste -d/ fileA fileB | sed 's/^/s\//;s/$/\/g/' | sed -f - fileC
答案 2 :(得分:1)
两相火箭:
sed -e "$(paste file[AB] | sed 's/\(.*\)\t\(.*\)/s\/\1\/\2\/g;/')" fileC
这样做是使用paste file[AB] | sed 's/\(.*\)\t\(.*\)/s\/\1\/\2\/g;/'
创建一个adhoc sed脚本:
s/AAAAA/111/g;
s/BBBBB/222/g;
s/CCCCC/333/g;
s/DDDDD/444/g;
然后以fileC
作为输入