【问题标题】:Multiple regex replacements based on lists in multiple files基于多个文件中的列表的多个正则表达式替换
【发布时间】:2013-03-27 14:29:37
【问题描述】:

我有一个包含多个文本文件的文件夹,我需要使用多个替换列表进行处理和格式化,如下所示:

old string1~new string1
old string2~new string2
etc~blah

我从多个文本文件的每一行的替换列表中运行每个替换对。现在我有一组 python 脚本来执行这个操作。我想知道的是,如果我切换到 sed 或 awk,它会使代码更简单、更易于维护吗?它会是一个更好的解决方案还是我应该更好地改进我的 Python 代码?我问是因为传入的文本文件定期出现,并且通常与以前有一些不同的结构,比如错误、拼写错误、多个空格,因为这些文件是由人类创建的。所以我必须不断调整我的代码和替换列表以使其正常工作。 谢谢。

【问题讨论】:

  • 很难说没有看到你的 Python 代码,所以我们有一个更好的主意,如果它是一个瓶颈......
  • 您在问题中使用了“字符串”一词,但您接受的解决方案使用正则表达式,那么它在上面“~”的左侧是字符串还是正则表达式?跨度>
  • 是的,很抱歉造成混淆,我使用正则表达式,而那些带有~的字符串实际上是正则表达式。

标签: python regex sed awk text-processing


【解决方案1】:

除非您的 python 代码真的很糟糕,否则切换到 awk 不太可能使其更易于维护。也就是说,它在 awk 中非常简单,但不能很好地扩展:

cat replacement-list-files* | awk 'FILENAME == "-" { 
  split( $0, a, "~" ); repl[ a[1] ] = a[2]; next }
  { for( i in repl ) gsub( i, repl[i] ) }1' - input-file

请注意,这一次只适用于一个文件。将1 替换为{ print > ( FILENAME ".new" ) } 之类的东西可以处理多个文件,但是如果你想处理大量文件,就必须关闭文件,这很快就会变得一团糟。如果您已经有了可行的解决方案,请坚持使用 Python。

【讨论】:

  • 仅供参考,无论您正在处理多少文件,您都无需担心使用 GNU awk 关闭文件。
【解决方案2】:

这是正则表达式替换脚本(大部分只是外观上与@WilliamPursell 发布的不同):

   awk -F'~' '
   NR==FNR{ map[$1] = $2; next }
   {
      for (old in map) {
         gsub(old,map[old]
      }
   }
   ' /wherever/mappingFile file

但这是我认为您真正需要的字符串替换脚本:

   awk -F'~' '
   NR==FNR{ map[$1] = $2; next }
   {
      for (old in map) {
         rlength = length(old)
         while (rstart = index($0,old)) {
            $0 = substr($0,1,rstart-1) map[old] substr($0,rstart+rlength)
         }
      }
   }
   ' /wherever/mappingFile file

在任何一种情况下,只需将其包含在 shell 循环中即可影响多个文件:

for file in *
do
   awk -F'~' '...' /wherever/mappingFile "$file" > tmp && mv tmp "$file"
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多