用sed awk或grep替换单词

时间:2015-02-02 20:21:09

标签: regex bash awk sed

我想替换文本文件中的某些单词。特别是美国拼写单词的英文拼写。我有两个拼写排列相同的数组,即

list_1 = ['惬意','克拉','检查']
list_2 = [' comfort',' karat',' check']

我是否可以在文本文件中搜索list_1中的元素并替换list_2中的元素?

2 个答案:

答案 0 :(得分:2)

此方法假定您可以访问GNU sed

要做的第一件事是使用此脚本从这些列表中获取信息:

$ cat script.sh
list_1=('cosy' 'carat' 'cheque')
list_2=('cozy' 'karat' 'check')
for i in "${!list_1[@]}"
do
    echo "s/\\b${list_1[i]}\\b/${list_2[i]}/g"
done >spelling.sed

这会生成文件:

$ cat spelling.sed 
s/\bcosy\b/cozy/g
s/\bcarat\b/karat/g
s/\bcheque\b/check/g

现在,我们可以使用该文件来更改拼写。例如:

$ echo "Decosy makes a cosy cheque." | sed -f spelling.sed
Decosy makes a cozy check.

请注意,Decosy的拼写不会更改。这是因为使用GNU扩展\b表示字边界。这样,只会改变整个单词。

答案 1 :(得分:0)

这是一个awk脚本,可一次扫描文件。

script.awk

BEGIN {
    patsplit(list1, arr1, /[[:alpha:]]+/);  # read array of word from list1
    patsplit(list2, arr2, /[[:alpha:]]+/);  # read array of word from list2
}
{                                    
    for (i in arr1) gsub(arr1[i], arr2[i]); # for each line, replace all words in arrays
}
1

执行:

 list_1=['cosy', 'carat', 'cheque']
 list_2=['cozy', 'karat', 'check'] 
 awk -v list1=$list_1 -v list2=$list_2 -f script.awk input.txt

请注意,此解决方案未考虑大写单词。