'perl -pe'只匹配文件开头?

hfsqlsce  于 2022-12-13  发布在  Perl
关注(0)|答案(2)|浏览(224)

我在努力

perl -pe 's;\A(?!syntax:);syntax: glob\n\n;' .hgignore

在具有这些内容的文件上:

dist
node_modules
.vscode

我期望的输出是:

syntax: glob

dist
node_modules
.vscode

我可以反复运行它,它不会保持预挂起。
我使用\A(?!syntax:)将正则表达式锚定到文件的开头,然后使用(?!表示“不后跟”。看起来\A匹配的是行的开头,而不是文件的开头。
如何仅匹配文件的开头?

bqujaahr

bqujaahr1#

使用-p开关时,文件是逐行读取的,所以代码不会看到整个文件,一次只能看到一行。
要将整个文件“slurp”到$_中,请执行perl -0777 -pe'...' file-0777取消设置输入记录分隔符,因此-p读取的“行”实际上是整个文件。请在perlrun中查看
然后正则表达式将在包含整个文件的多行字符串上运行。
对于一个多行字符串,我们经常需要/m修饰符,这样^$就可以匹配字符串中各行的开头和结尾,而\A则可以匹配整个字符串的开头。我们还经常需要/s修饰符,这样.也可以匹配一个换行符。
然而,对于您的目的来说,似乎不需要这些。然后,如果没有/m修饰符,^锚匹配字符串的开头,就像\A一样。但我确实发现\A更好,因为它清楚地表达了意图。

f87krz0w

f87krz0w2#

您遇到的问题源于这样一个事实,即-p意味着-n,它为文件的每一行计算程序。
您的问题可以通过只尝试替换文件的第一行来解决。

perl -pe's{^(?!syntax:)}{syntax: glob\n\n} if $. == 1' .hgignore

或者,您可以告诉Perl整个文件是一行-0777或更新的-g

perl -0777pe's{^(?!syntax:)}{syntax: glob\n\n}' .hgignore

相关问题