【发布时间】:2015-09-20 05:47:33
【问题描述】:
我有一个非常大的文件,其中包含以下几行:
start :234
modify 123 directory1/directory2/file.txt
delete directory3/file2.txt
modify 899 directory4/file3.txt
每个块都以模式“start : #”开始,并以空行结束。在块内,每一行都以“修改#”或“删除”开头。
我需要修改每一行的路径,特别是在前面附加一个目录。我会使用一个通用的正则表达式来覆盖整个文件以进行“修改#”或“删除”,但由于该文件中有大量其他数据,可能会有其他匹配这个有点模糊的模式。所以我需要使用多行匹配来查找整个块,然后在该块内执行编辑。这可能会导致单次修改超过 10,000 次,因此我也在尝试将执行时间缩短到 30 分钟以内。
我目前的尝试是 sed 单线:
sed '/^start :[0-9]\+$/ { :a /^[modify|delete] .*$/ { N; ba }; s/modify [0-9]\+ /&Appended_DIR\//g; s/delete /&Appended_DIR\//g }' file_to_edit
它旨在找到“开始”行,在这些行以“修改”或“删除”开头时循环,然后应用 sed 替换。
但是,当我执行这个命令时,并没有做任何改变,输出和原来的文件一样。
我形成的命令有问题吗?在 perl 中这样做会更容易/更有效吗?任何帮助将不胜感激,我会澄清我能做到的地方。
【问题讨论】:
-
你为什么关心块?如果可以针对所有以“修改”或“删除”开头的行,您将获得良好的性能。如果你正在寻找性能,如果认为 sed 会比 perl 更好。但我怀疑一种 awk 方式会更快。
-
由于“删除”模式的简单性,以及分散在文件其余部分的数千行源代码,至少有可能另一行将以相同的模式开始,不在这些区块之一内。
-
好的,所以主要原因是该文件可能包含其他以“delete”开头的行或“modify”开头的行,这些行位于块之外并且您想保留?
-
@CasimiretHippolyte 是的,完全正确