如何替换文件中的文本 - 所需的条件和算术

如何替换文件中的文本 - 所需的条件和算术

我需要一个脚本来更改某些文本文件中的内容。这有点超出了我有限的 bash 技能。也许 perl 或 python 会是更好的方法,我对这两者都没有经验。

我有大量根据报告创建的文本文件。其中一些文件包含一个错误,我需要替换错误列为 $0.00 的货币值。新值必须是同一文件中报告的另一个值的两倍。

需要修改的文件的文件名都包含“Summary”一词。如果文件名中没有“Summary”,则应忽略该文件。

这些文件包含一行“类别 X 成本价格:$0.00”,其中 X 是一个数字。仅当 X 为 0(零)时,才必须替换 $0.00,X 的任何其他值都应忽略该文件。我想通过检查是否存在字符串“类别 0 成本价格:$0.00”来识别这一点。

其他以“类别”开头的行在这里并不重要,应忽略(例如“类别 X 销售价格:$0.00”,其他行也存在)。

此处只有“类别 X 成本价:0.00 美元”很重要。该行中的值始终为 $0.00,并且仅当 X 为零时才需要修改。

新值是“成本”值乘以 2。

与下面的示例不同,感兴趣的行并不固定到特定的行号。 “成本”可能并不总是在第二行,“类别 X 成本价格”可能并不总是在第四行。

例子 :

文件:1234 摘要.文本

Some data
Cost: $15.73
Line of data
Category 0 cost price: $0.00,
Category 0 sale price: $0.00,
Category 4 list price: $44.95,
More data

“类别 X 成本价格”为零,因此价格需要更改为 ($15.73 * 2) $31.46(注意,必须保留在修改行的末尾)

修改文件:1234 Summary.text

Some data
Cost: $15.73
Line of data
Category 0 cost price: $31.46,
Category 0 sale price: $0.00,
Category 4 list price: $44.95,
More data

文件:2468 摘要.文本

Some data
Cost: $1.32
Line of data
Category 12 cost price: $0.00,
Category 5 sale price: $4.75,
Category 0 list price: $4.75,
More data

“类别 X 成本价格”不为零,忽略此文件,因为不需要更改。


总而言之,循环遍历包含单词“Summary”的文件名,如果存在字符串“Category 0 Price: $0.00”,则将“0.00”替换为“Cost: $X.XX”行中值的两倍。否则忽略该文件。

我还需要一份已修改文件的列表。将文件名添加到单独的文本文件中会很棒。

答案1

TXR 口齿不清解决方案对我有用。

我使用#;注释符号禁用将(rename-path ...)每个临时文件重命名回原始名称的表达式;如果文件中的内容看起来不错,请删除#;符号以激活就地替换.tmp.tmp如果没有更改,则改进方法是删除该文件。

(each ((file (glob "*Summary.txt")))
  (let ((cost 0.0))
    (flow
      (file-get-lines file)
      (mapcar (do match-case @1
                (`Cost: $@val`
                  (set cost (flo-str val))
                  @1)
                ("Category 0 cost price: $0.00,"
                  (pic "Category 0 cost price $#.##," (* 2 cost)))
                (@else @1)))
      (file-put-lines `@file.tmp`))
    #;(rename-path `@file.tmp` file)))

相关内容