【发布时间】:2014-08-29 06:50:15
【问题描述】:
我有一个包含替换对列表的文件(大约 100 个),sed 使用这些替换对替换文件中的字符串。
这对是这样的:
old|new
tobereplaced|replacement
(stuffiwant).*(too)|\1\2
我当前的代码是:
cat replacement_list | while read i
do
old=$(echo "$i" | awk -F'|' '{print $1}') #due to the need for extended regex
new=$(echo "$i" | awk -F'|' '{print $2}')
sed -r "s/`echo "$old"`/`echo "$new"`/g" -i file
done
我不禁认为有一种更优化的方式来执行替换。我尝试转动循环以首先运行文件的行,但结果证明成本要高得多。
还有其他方法可以加快这个脚本的速度吗?
编辑
感谢所有快速回复。让我在选择答案之前尝试各种建议。
需要澄清的一点:我还需要子表达式/组功能。例如,我可能需要的一种替换是:
([0-9])U|\10 #the extra brackets and escapes were required for my original code
关于改进的一些细节(待更新):
- 方法:处理时间
- 原始脚本:0.85s
-
cut而不是awk:0.71s - anubhava的方法:0.18s
- chthonicdaemon 的方法:0.01s
【问题讨论】:
-
这个问题有答案here。是的,您正在寻找速度,但请回答两个问题。
-
老实说,这个问题并没有真正提出速度的因素,也没有提出子表达式的因素。这里给出的答案更有帮助。
-
好的,然后通过将子表达式放在数据中并提供输入和所需输出来澄清您对子表达式的问题,这将大大改善您的问题并清楚地将其与其他问题区分开来。
-
+1 用于运行所有基准测试。我自己学会了一些技巧。