【问题标题】:Perl - replace line in txt file with different matchesPerl - 用不同的匹配替换txt文件中的行
【发布时间】:2014-02-20 08:10:51
【问题描述】:

我今天早上刚开始学习 Perl,我的主要目标是替换文本行。假设我有以下文本文件;

manufacturer=BMW
manufacturer=Honda
manufacturer=Mercedes
manufacturer=Toyota
manufacturer=Noble
manufacturer=Maserati
manufacturer=Jaguar
manufacturer=Ford

我想替换所有的行,使文本文件看起来像这样;

manufacturer=XXX
manufacturer=XXX
manufacturer=XXX
manufacturer=XXX
manufacturer=XXX
manufacturer=XXX
manufacturer=XXX
manufacturer=XXX

我已经学会了如何用我想要的文本替换与特定大小写匹配的文本行,如下所示;

s/BMW/XXX/ig

但考虑到在这个文件中我有不同的情况,我不想每次都用不同的制造商(本田、梅赛德斯、丰田)更新 perl 代码,然后重新运行代码。当然,必须有一种方法可以让我简单地搜索以(而不用担心制造商)开头的行

manufacturer=*whatever*

然后用

替换整行
manufacturer=XXX

有人可以说明如何去做吗?

【问题讨论】:

  • 如果您想更改所有行,您只需在文件中的每一行打印一次manufacturer=XXX。 IE。 perl -lne'print "manufacturer=XXX"' input > output
  • 感谢 TLP。这会用“manufacturer=XXX”覆盖现有文件中的每一行吗?
  • 它会将文件中的每一行写入一行到一个新文件中。我不建议为新手覆盖,但您可以使用 -i 标志这样做。请记住,变化是不可逆转的。

标签: perl replace line


【解决方案1】:

我会这样写

s/^manufacturer=\K.+/XXX/

开头的^ 确保manufacturer= 从字符串的开头开始,而不是只出现在字符串的任何位置。

\K (for Keep) 元字符意味着忽略替换中的所有前面的东西,所以模式 匹配 ^manufacturer=.+ 但只有 .+被替换了。

最后,.+ 匹配直到字符串末尾或尾随换行符的所有内容(. 不匹配换行符)。

【讨论】:

    【解决方案2】:

    您需要利用正则表达式的全部功能:

    s/^manufacturer=\w+/manufacturer=XXX/ig
    

    【讨论】:

    • 谢谢艾丹。为什么制造商前面有'^'?
    • ^ 是匹配字符串开头的零宽度断言。
    • 呵呵,我喜欢“充分利用正则表达式的力量”
    【解决方案3】:

    正则表达式的工作:

    s/manufacturer=.*/manufacturer=XXX/g
    

    根据您的评论,这匹配 = 和 EOL 之间的所有内容,并将其替换为 XXX

    综合文档here

    【讨论】:

    • @TLP 是的,正如我提到的,op 可能需要根据需要调整 RegEx。匹配地球上所有汽车品牌/型号的完美正则表达式并非易事(除非在 op 的示例数据集中,品牌总是介于 = 和 EOL 之间)
    • 再次感谢。是的,品牌始终介于 '=' 和 EOL 之间。
    • 你没有提到它,因为它发生了,这就是我这样做的原因。我相信我只会使用s/^(?<=manufacturer=).*$/XXX/ 删除任何字符,因为格式似乎暗示汽车名称后面不会有其他数据。
    • 这也会将designer=Matt Smith 替换为designer=XXX,这不是我们要求的。
    • @Barodin 是的,我知道。我假设 op 的数据集反映了问题中的内容,就像您假设要求在每行的开头有 manufacturer 一样。但我不会因此而对你投反对票。 ;) 无论如何,答案已更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多