Perl命令行多行replace

我试图用命令行perlreplace多行文件中的文本。 我正在使用Ubuntu的NATTY。

以下是我的文本文件(称为test.txt)的内容:

[mysqld] # # * Basic Settings # # # * IMPORTANT # If you make changes to these settings and your system uses apparmor, you may # also need to also adjust /etc/apparmor.d/usr.sbin.mysqld. # user = mysql socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp skip-external-locking 

下面是我的perl命令:

 perl -i -pe "s/(\[mysqld\][^\^]+)/\1\nsometext/g" test.txt 

但是,而不是replace文件中的所有文本,下面是我最终:

 [mysqld] sometext# # * Basic Settings # # # * IMPORTANT # If you make changes to these settings and your system uses apparmor, you may # also need to also adjust /etc/apparmor.d/usr.sbin.mysqld. # user = mysql socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp skip-external-locking # 

我尝试了RegexBuddy中的Regex for Perl,它匹配文本文件中的所有内容,但由于某些原因,它不能在命令行上使用perl。

我会很感激一些帮助。

提前致谢。

Solutions Collecting From Web of "Perl命令行多行replace"

您正在逐行读取文件,因此只有第一行符合您的正则表达式。 你想要做什么 – 如果你真的想删除大部分的内容 – 是通过使用-0选项,如-0777 。 这是行结束处理,而777只是一个习惯上使用的数字,足够大的八进制数以致导致文件sl </s>。

 perl -0777 -i -pe 's/(\[mysqld\][^\^]+)/$1\nsometext/g' test.txt 

另外,我换了你的报价。 如果你在* nix,看起来你是,单引号是可取的。 例如, $1不会被shell插入。

-p开关使Perl遍历输入的每一 ,并为每个输入执行给定的代码(并在之后打印行)。 具体来说就是命令

 perl -p -e 'SOME_CODE_HERE;' 

与运行以下Perl程序完全等价:

 LINE: while (<>) { SOME_CODE_HERE; } continue { print or die "-p destination: $!\n"; } 

你的正则表达式似乎打算一次匹配多行,这显然不会工作,如果Perl是逐行处理输入。 要使其按照预期工作,您(至少)有两个选择:

  1. 通过使用-0 NNN开关来改变Perl对于什么构成线的概念。 尤其是,开关-0777导致Perl将每个输入文件视为单个“行”。

  2. 重写你的代码,例如使用..触发器操作符 。

顺便说一句,我强烈怀疑你的正则表达式并不意味着你的想法。 特别是, [^\^]+匹配不包含插入符号( ^ )的一个或多个字符的字符串。 由于你的输入似乎不可能包含任何插入符号,这似乎基本上等同于(?s:.+) (或者如果使用/s修饰符,则只是.+ )。