我在努力
perl -pe 's;\A(?!syntax:);syntax: glob\n\n;' .hgignore
在具有这些内容的文件上:
dist
node_modules
.vscode
我期望的输出是:
syntax: glob
dist
node_modules
.vscode
我可以反复运行它,它不会保持预挂起。
我使用\A(?!syntax:)
将正则表达式锚定到文件的开头,然后使用(?!
表示“不后跟”。看起来\A
匹配的是行的开头,而不是文件的开头。
如何仅匹配文件的开头?
2条答案
按热度按时间bqujaahr1#
使用
-p
开关时,文件是逐行读取的,所以代码不会看到整个文件,一次只能看到一行。要将整个文件“slurp”到
$_
中,请执行perl -0777 -pe'...' file
。-0777
取消设置输入记录分隔符,因此-p
读取的“行”实际上是整个文件。请在perlrun中查看然后正则表达式将在包含整个文件的多行字符串上运行。
对于一个多行字符串,我们经常需要
/m
修饰符,这样^
和$
就可以匹配字符串中各行的开头和结尾,而\A
则可以匹配整个字符串的开头。我们还经常需要/s
修饰符,这样.
也可以匹配一个换行符。然而,对于您的目的来说,似乎不需要这些。然后,如果没有
/m
修饰符,^
锚匹配字符串的开头,就像\A
一样。但我确实发现\A
更好,因为它清楚地表达了意图。f87krz0w2#
您遇到的问题源于这样一个事实,即-p意味着-n,它为文件的每一行计算程序。
您的问题可以通过只尝试替换文件的第一行来解决。
或者,您可以告诉Perl整个文件是一行
-0777
或更新的-g
。