我需要一个脚本来更改某些文本文件中的内容。这有点超出了我有限的 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)))