簡體   English   中英

Perl命令行多行替換

[英]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 逐行處理輸入,這顯然不起作用。 為了使其按預期工作,您(至少)有兩個選擇:

  1. switch .通過使用-0 開關來改變 Perl 關於什么構成行的概念。 特別是,開關-0777使 Perl 將每個輸入文件視為單個“行”。

  2. 重寫您的代碼,例如使用..觸發器操作符

順便說一句,我強烈懷疑你的正則表達式並不意味着你認為它的意思。 特別是, [^\\^]+匹配一個或多個不包含插入符號 ( ^ ) 的字符的字符串。 由於您的輸入似乎不太可能包含任何插入符號,因此這似乎基本上等同於(?s:.+) (或者,如果您使用/s修飾符,則只是.+ )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM