Obi*_*ill 16 linux ubuntu perl command-line
我正在尝试使用命令行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
Run Code Online (Sandbox Code Playgroud)
以下是我的perl命令:
perl -i -pe "s/(\[mysqld\][^\^]+)/\1\nsometext/g" test.txt
Run Code Online (Sandbox Code Playgroud)
但是,下面是我最终得到的内容,而不是替换文件中的所有文本:
[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
#
Run Code Online (Sandbox Code Playgroud)
我在RegexBuddy中为Perl尝试了Regex并且它匹配文本文件中的所有内容,但由于某种原因,它在命令行上使用perl无效.
我很感激一些帮助.
提前致谢.
TLP*_*TLP 28
您正在逐行读取文件,因此只有第一行与正则表达式匹配.您想要做的事情 - 如果您真的希望删除大部分内容 - 是使用-0
选项来啜饮文件,例如-0777
.这是行结束处理,并且777
只是一个常规用作八进制数的数字,足以导致文件淤变.
perl -0777 -i -pe 's/(\[mysqld\][^\^]+)/$1\nsometext/g' test.txt
Run Code Online (Sandbox Code Playgroud)
另外,我替换了你的报价.如果你在*nix,你似乎是,单引号是更好的.例如,$1
shell不会插入.
该-p
开关使Perl迭代输入的每一行并为每一行执行给定的代码(并在之后打印行).具体来说,命令
perl -p -e 'SOME_CODE_HERE;'
Run Code Online (Sandbox Code Playgroud)
完全等同于运行以下Perl程序:
LINE: while (<>) {
SOME_CODE_HERE;
} continue {
print or die "-p destination: $!\n";
}
Run Code Online (Sandbox Code Playgroud)
你的正则表达似乎是为了同时匹配多行,如果Perl逐行处理输入,这显然是行不通的.为了使其按预期工作,您有(至少)两个选项:
顺便说一句,我强烈怀疑你的正则表达式并不意味着你的意思.特别是,[^\^]+
匹配一个不包含插入符号(^
)的一个或多个字符的字符串.由于您的输入似乎不太可能包含任何插入符号,因此这看起来基本上等同于(?s:.+)
(或者只是.+
使用/s
修饰符).
归档时间: |
|
查看次数: |
12423 次 |
最近记录: |