一尘不染

Perl命令行多行替换

linux

我正在尝试使用命令行perl替换多行文件中的文本。我正在使用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

但是,下面是我最终得到的结果,而不是替换文件中的所有文本:

[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中为Perl尝试了Regex,它与文本文件中的所有内容都匹配,但是由于某些原因,在命令行上使用perl不能正常工作。

我将不胜感激。

提前致谢。


阅读 924

收藏
2020-06-02

共1个答案

一尘不染

您正在逐行读取文件,因此只有第一行与您的正则表达式匹配。如果您确实要删除大部分内容,那么您想要做的就是通过使用-0选项(例如)对文件进行处理-0777。这是行尾处理,777只是常规上用作八进制数的数字,该数字足够大以致于引起文件拖尾现象。

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

另外,我替换了您的报价。如果您似乎在* nix中,则最好使用单引号。举例来说,$1shell不会插值。

2020-06-02