使用awk替换list_file中的多个模式,其中一个在target_file中

问题描述 投票:0回答:1

我遇到了问题

1)我得到了一个list_file,用于像这样的inlace替换

Replacement pattern ; Matching patterns

EXTRACT ___________________
toto ; tutu | tata | tonton  | titi 
bobo ; bibi | baba | bubu | bebe 
etc. 14000 lines !!!
_____________________________

2)我有一个目标文件,我想在其中替换这些模式

EXTRACT INPUT _______________
hello my name is bob and I am a Titi and I like bubu
_____________________________

我希望它成为

EXTRACT OUTPUT ______________
hello my name is bob and I am a toto and I like bobo
_____________________________

例如,有一个替换:

echo 'toto; tutu | tata | tonton | titi ' | awk '{gsub(/ tutu | tata | tonton | titi /," toto ")}1'
gives
toto; toto | toto | toto | toto

awk -F';' 'NR==FNR{A[$1]=$2; next} IGNORECASE = 1 {for(i in A) gsub(/A[i]/,i)}1’

我希望:

  1. 注册一个数组A,内容为$ 2,关键为$ 1,所以在第一行$ 2 ='tutu |塔塔| tonton |蒂蒂'$ 1 ='托托'
  2. 替换为gsub(/ $ 2 /,$ 1)} 1所以在第一行awk'IGNORECASE = 1 {gsub(/ tutu | tata | tonton | titi /,“toto”)} 1

可悲的是,awk似乎并不理解管道«| »作为OR指示符的字符...我也尝试用sed实现这一点但是这个选项非常慢,如果它工作:

有没有人有更好的主意?谢谢M.

bash awk sed gawk
1个回答
1
投票

通过将数组引用放在regexp分隔符中,您将A[i]转换为regexp中的文字字符,而不是包含由字符串索引的正则表达式的数组。只是不要这样做。你设置IGNORECASE的位置也没有意义。试试这个:

awk -F';' 'BEGIN{IGNORECASE = 1} NR==FNR{A[$1]=$2; next} {for(i in A) gsub(A[i],i)}1'

我不是说这是一个好主意,但它可能会给你你正在寻找的输出。停止使用单词“pattern”btw作为被子和毛衣的图案 - 在文本匹配和替换中使用regexpstring,无论你在每种情况下的意思。如果您了解正则表达式与字符串的出现位置,您会发现编写和理解代码要容易得多。

© www.soinside.com 2019 - 2024. All rights reserved.