[英]Perl command line multi-line replace
我正在嘗試使用命令行 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 的正則表達式,它匹配文本文件中的所有內容,但由於某種原因,它無法在命令行上使用 perl。
我會很感激一些幫助。
提前致謝。
您正在逐行讀取文件,因此只有第一行與您的正則表達式匹配。 你想要做的——如果你真的想刪除大部分內容——是通過使用-0
選項來刪除文件,例如-0777
。 這是行結束處理,而777
只是一個按慣例用作八進制數的數字,它足夠大以導致文件 slurping。
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 逐行處理輸入,這顯然不起作用。 為了使其按預期工作,您(至少)有兩個選擇:
順便說一句,我強烈懷疑你的正則表達式並不意味着你認為它的意思。 特別是, [^\\^]+
匹配一個或多個不包含插入符號 ( ^
) 的字符的字符串。 由於您的輸入似乎不太可能包含任何插入符號,因此這似乎基本上等同於(?s:.+)
(或者,如果您使用/s
修飾符,則只是.+
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.