我经常需要在文件中进行多次替换。为了解决这个问题,我创建了两个文件old.text
和new.text
。第一个包含必须找到的单词列表。第二个包含应该替换那些单词的列表。
- 我的所有文件都使用 UTF-8 并使用各种语言。
我已经构建了这个脚本,我希望它可以进行替换。首先,它一次读取 old.text
一行,然后用 new.text
文件中的相应单词替换 input.txt 中该行的单词。
#!/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
但是,我的解决方案效果不佳。当我运行脚本时:
- 在第 6 行,
sed
命令不知道$number
在哪里结束。 $number
变量正在更改为“0+1”,然后是“0+1+1”,而它应该更改为“1”,然后是“2”。- 带有
awk
的行似乎只是将 input.txt 完全原封不动地复制到 output.txt。
你有什么建议吗?
更新:
标记的答案效果很好,但是,我经常使用这个脚本并且需要很多小时才能完成。因此,我为可以更快地完成这些替换的解决方案悬赏。 BASH、Perl 或 Python 2 中的解决方案都可以,前提是它仍然与 UTF-8 兼容。如果您认为使用 Linux 系统上常用的其他软件的其他解决方案会更快,那么这也可能很好,只要不需要大量依赖项即可。
最佳答案
- 第 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
此解决方案一次从替换文件
和替换文件
中读取一行,并执行内联sed
替换。
关于ruby - 查找和替换多个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8243864/