我遇到了问题
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’
我希望:
可悲的是,awk似乎并不理解管道«| »作为OR指示符的字符...我也尝试用sed实现这一点但是这个选项非常慢,如果它工作:
有没有人有更好的主意?谢谢M.
通过将数组引用放在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作为被子和毛衣的图案 - 在文本匹配和替换中使用regexp
或string
,无论你在每种情况下的意思。如果您了解正则表达式与字符串的出现位置,您会发现编写和理解代码要容易得多。