Vil*_*age 5 ruby bash perl python-2.7
我经常需要在文件中进行多次替换.为了解决这个问题,我已经创建了两个文件old.text和new.text.第一个包含必须找到的单词列表.第二个包含应该替换它们的单词列表.
我已经构建了这个脚本,我希望可以替换它.首先,它一次读取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)
但是,我的解决方案效果不佳.当我运行脚本时:
sed命令不知道$number结束的位置.$number变量变为"1",然后变为"2"时,变量变为"0 + 1",然后变为"0 + 1 + 1".awk除了将output.txt完全复制到output.txt之外,该行似乎没有做任何其他操作.你有什么建议吗?
更新:
标记的答案效果很好,但是,我经常使用这个脚本,需要花费很多时间才能完成.因此,我提供了一个解决方案的赏金,可以更快地完成这些替换.BASH,Perl或Python 2中的解决方案都可以,只要它仍然兼容UTF-8.如果您认为使用Linux系统上常用的其他软件的其他解决方案会更快,那么这也可能没问题,只要不需要巨大的依赖关系.
尝试使用双引号引用变量
linefromnewwords = $(sed -n"$ number"p newwords.txt)
改为:
number =`expr $ number + 1`
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替换.