【问题标题】:Substituting words with sed awk or grep用 sed awk 或 grep 替换单词
【发布时间】:2019-06-24 00:23:48
【问题描述】:

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

list_1=['舒适'、'克拉'、'支票']
list_2=['舒适', 'karat', 'check']

我能否在文本文件中搜索 list_1 中的元素并替换为 list_2 中的元素?

【问题讨论】:

  • 是的,使用 awk。如果您还没有这本书,请获取 Arnold Robbins 的《Effective Awk Programming》一书,如果您在尝试编写脚本后有任何问题,请告诉我们。
  • “我能……吗?”我不知道。你可以?不过,我很确定这是可能的。
  • 看这个帖子:link

标签: regex bash awk sed


【解决方案1】:

此方法假定您有权访问 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。这样,只有整个单词被改变了。

【讨论】:

  • 非常感谢。我真的很感激。
  • 此解决方案有效,但它会全面扫描列表中每个单词的输入文件。希望有sed 脚​​本可以在一次扫描中完成。
  • @DudiBoy 不,请再看一遍。输入实际上是使用sed -f spelling.sed一次扫描 中处理的。您看到的循环仅用于创建 spelling.sed
【解决方案2】:

这是一个 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2010-10-27
    • 2011-01-23
    相关资源
    最近更新 更多