找到并替换许多单词

Vil*_*age 5 ruby bash perl python-2.7

我经常需要在文件中进行多次替换.为了解决这个问题,我已经创建了两个文件old.textnew.text.第一个包含必须找到的单词列表.第二个包含应该替换它们的单词列表.

  • 我的所有文件都使用UTF-8并使用各种语言.

我已经构建了这个脚本,我希望可以替换它.首先,它一次读取old.text一行,然后将input.txt中该行的单词替换为new.text文件中的相应单词.

#!/bin/sh
number=1
while read linefromoldwords
do
    echo $linefromoldwords
    linefromnewwords=$(sed -n '$numberp' new.text)
    awk '{gsub(/$linefromoldwords/,$linefromnewwords);print}' input.txt >> output.txt
    number=$number+1
echo $number
done <  old.text
Run Code Online (Sandbox Code Playgroud)

但是,我的解决方案效果不佳.当我运行脚本时:

  • 在第6行,sed命令不知道$number结束的位置.
  • $number变量变为"1",然后变为"2"时,变量变为"0 + 1",然后变为"0 + 1 + 1".
  • awk除了将output.txt完全复制到output.txt之外,该行似乎没有做任何其他操作.

你有什么建议吗?

更新:

标记的答案效果很好,但是,我经常使用这个脚本,需要花费很多时间才能完成.因此,我提供了一个解决方案的赏金,可以更快地完成这些替换.BASH,Perl或Python 2中的解决方案都可以,只要它仍然兼容UTF-8.如果您认为使用Linux系统上常用的其他软件的其他解决方案会更快,那么这也可能没问题,只要不需要巨大的依赖关系.

jay*_*ngh 8

  • 一行6,sed命令不知道$ number结束的位置.

尝试使用双引号引用变量

linefromnewwords = $(sed -n"$ number"p newwords.txt)

  • $ number变量更改为"0 + 1",然后变为"0 + 1 + 1",此时应变为"1",然后变为"2".

改为:

number =`expr $ number + 1`

  • 使用awk的行似乎没有做任何事情,只需将input.txt完全复制到output.txt.

awk不会将变量置于其范围之外.awk中的用户定义变量需要在awk的BEGIN语句中使用或预定义时定义.您可以使用-v选项包含shell变量.

这是一个解决方案,bash可以满足您的需求.

Bash解决方案:

#!/bin/bash

while read -r sub && read -r rep <&3; do
  sed -i "s/ "$sub" / "$rep" /g" main.file
done <old.text 3<new.text
Run Code Online (Sandbox Code Playgroud)

该解决方案一次从substitution file和读取一行replacement file并执行in-line sed替换.