Grep

Perl 多行匹配以不帶 ‘#s’ 開頭的 ‘something’

  • May 29, 2019

更新:

  1. Stephane https://unix.stackexchange.com/a/521560/354415在這裡給出了這個 MULTILINE 問題的真正答案
  2. 或者通過 Terdon 逐行使用 perl:https ://unix.stackexchange.com/a/521512/354415
  3. 或者,我自己在這裡逐行與 IFS:https ://unix.stackexchange.com/a/521550/354415

這是我的新玩具:

問題是我希望它只匹配參數前面沒有 #\s* 的行。

請不要提供替代程式碼,例如 sed 等。使用 perl

perl -we 'my $file= "parameter=9
# parameter=10
parameter=10
"; $file=~ s/.*((?<!^# ))parameter\s*=.*/parameter=replaced/g; print(":$file:\n")'

預期產出

parameter=replaced
# parameter=10
parameter=replaced

PS,如果您有興趣了解我的進展情況,請看這裡:Perl Negative Lookbehind with variable length bypass 也許?

這會因您選擇將多行字元串作為單個變數傳遞而變得複雜。將其轉換為數組要容易得多,因此您可以s///以最簡單的形式使用運算符。試試這個:你說你對程式碼改進不感興趣,但為了幫助未來的使用者,這是你寫的一個簡化版本,它也避免了將 ALLCAPS 用於非環境變數的不良做法:

newparameter='parameter=replaced'
filesection='
  parameter=9
# parameter=10
parameter=10
'

matchparamperl='^([^#]*)parameter\s*=.*'

sectionfixed=$( perl -le '
                        @lines=split(/\n/,$ARGV[0]);
                        s/$ARGV[1]/$1$ARGV[2]/g for @lines; 
                        print join "\n", @lines
                        ' "$filesection" "$matchparamperl" "$newparameter") 
echo "$sectionfixed"

這將返回:

$ echo "$sectionfixed"

  parameter=replaced
# parameter=10
parameter=replaced

或者,更短一點:

sectionfixed=$( perl -le '
                        do{
                           s/$ARGV[1]/$1$ARGV[2]/g; print
                        } for split(/\n/,$ARGV[0])
                        ' "$filesection" "$matchparamperl" "$newparameter")

引用自:https://unix.stackexchange.com/questions/521508