ruby - 查找和替换多个单词

标签 ruby perl bash python-2.7

我经常需要在文件中进行多次替换。为了解决这个问题,我创建了两个文件old.textnew.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/

相关文章:

linux - 在Linux中安装脚本是什么意思

bash - 带有 comm 命令的行号。是否可以?

Ruby/Nokogiri XSLT 转换和外部函数

perl - Perl 代码主要是用面向对象设计编写的吗?

ruby-on-rails - "msvcrt-ruby18.dll was not found"与 ruby

perl - 获取 perl -w 标签的结果到一个文件中

perl - 在 Perl 脚本中分离配置数据和脚本逻辑

mysql - 来自命令行的注入(inject)证明 SQL 语句

ruby - sinatra 是否有任何 RSpec HTML 标签匹配器扩展?

ios - 如何完全删除 calabash-ios/robotframework