gpt4 book ai didi

ruby - 查找和替换多个单词

转载 作者:数据小太阳 更新时间:2023-10-29 07:08:50 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com