我使用的Textwrangler在为替换添加数字时不尽如人意。 我有一个xml文件,其中包含几个字符串:
generatoritem id="Outline Text"
我需要在每次替换结束时添加一个递增数字,如下所示:
generatoritem id="Outline Text1"
所以我需要更换'大纲文字'用'大纲文字'和递增的数字。
我找到了一个类似问题的答案,并尝试在textwrangler中键入并点击Check Syntax:
perl -ple 's/"Outline Text"/$n++/e' /path/of/file.xml
很多错误..所以我需要解释这个漂亮的一个班轮。或者可能获得一个新的或Python脚本?
答案 0 :(得分:0)
-p使perl一次读取一行文件,对于每一行,它将执行脚本,然后发出由脚本修改的行。请注意,隐式使用名为$ _的变量 - 它用作保持读取行的变量,它也是s ///的默认目标,它是默认的源每行后的印刷品。
对于你描述的任务,你不需要-l(-ple中间的l),所以我不打算进入它。删除它。
最后的标志-e(-ple末尾的e)介绍了你的脚本'从命令行本身 - 即允许在没有源文件的情况下快速小规模地使用perl。
在你的剧本的胆量上:你描述的目的是错误的,并且作为一种尝试,它也有点不安全。
如果您想更改"大纲文字"进入别的东西,你当前的脚本用$ n替换所有它 - 这不是你想要的。一个简单的方法来完成您的要求是
s/(id="Outline text)(")/$1 . $n++ . $2/eg;
这与您想要的确切文本相符,并注意我还匹配id =以确保您的文件的其他部分包含"大纲文字" - 不要笑,这可能发生!
通过在模式的部分周围放置(),这些位保存在称为$ 1,$ 2等的变量中。然后我在替换部分中使用这些。的。操作员将各个部分粘合在一起,给出结果。
s ///末尾的/ e表示替换被视为Perl表达式,而不仅仅是普通的替换字符串。我还添加了g,这使得它在一行上不止一次匹配 - 你可能在输入文件的一行上有多个有趣的id =,所以要做好准备。
最后一点。您似乎建议您从1开始编号,因此将$ n ++替换为++ $ n。对于我建议的更改,变量$ n将从空(有效为零)开始,它将增加到1(和2,以及3 ......),然后使用它的值。< / p>