簡體   English   中英

Sed 或 Perl:一個帶有正則表達式指令的文件,每行一條指令,在另一個文件上執行

[英]Sed or Perl: One file with regex instructions, one instruction per line, executed on another file

我正在純粹在 bash/tmux 中設置一個正則表達式學習環境,其中包含一個包含正則表達式的文件的窗格、一個用於處理文本文件的窗格和一個用於 bash shell 的窗格。 我正處於“ The Bastards Book of Ruby ”-regex 章節的開頭。

'Bastard's Book' 展示了一個'negative-lookahead'正則表達式的例子(完美,讓我們學習),其中 perl 被推薦而不是 sed。 因為我要使用 CLI 方法-> Bash 命令: $ perl -p file_with_regex.pl test.txt (這會打印 test.txt 中的行並帶有預期的替換)

問題:我將如何添加 regex.pl 文件的第二個正則表達式(在新行上),並讓 perl 執行第一條(下一條)第二條指令來處理文本文件?

    # regex.pl
    s/^(?!Mr)/Ms./g
    s/Ms./Mrs./g

(添加第二個正則表達式會導致“由於編譯錯誤,regex.pl 的執行中止。”)

這里的總體目標是在 Ruby 中取得進展,同時盡可能簡潔地測試正則表達式。 在這樣做的同時學習最少的 sed/perl 將是一個加分項,因為正確地深入了解 perl 需要從 Ruby 那里花一些時間(當需要深入了解 perl 時,我會花一些時間了解基礎知識)。 如果沒有啟用命令行文件方法的 perl 開關,我越看越有必要在 Ruby 中執行此操作。

基本答案是每行后都需要一個分號。

perlrun 轉述-p讀取所有輸入行,運行您指定的命令,然后打印出$_的值(您在此腳本中運行替代命令的隱式變量)。

因此,去除魔法, -p將您的代碼轉換為:

LINE:
while (<>) {
    # regex.pl
    s/^(?!Mr)/Ms./g
    s/Ms./Mrs./g
} continue {
    print or die "-p destination: $!\n";
}

Perl 需要在語句之間使用分號(但塊末尾的終端分號是可選的)因此出現錯誤。

我個人建議將上面的整個腳本寫入文件而不是使用-p因為它遠沒有那么神奇,但歡迎您以任何一種方式進行。

如果您要編寫整個腳本,我會推薦以下內容:

use strict;
use warnings;

while ( my $line = <ARGV> ) {

    $line =~ s/^(?!Mr)/Ms./g;
    print "After first subst: $line";

    $line =~ s/Ms./Mrs./g;
    print "After second subst: $line";
}

use strictuse warnings是您想要在任何 perl 腳本頂部的樣板文件(以捕獲拼寫錯誤和其他常見錯誤)並且顯式調用變量$line讓您更好地了解腳本的工作方式( $_非常神奇對於初學者和許多錯誤的來源 IMO,但是當你知道什么是什么時很棒)。

如果您對<><ARGV>感到疑惑,它們是相同的東西,意思是“通讀作為命令行參數提供給此腳本的所有文件行,或者如果沒有提供文件,則通讀標准輸入”。

暫無
暫無

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

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