Grep
Perl 多行匹配以不帶 ‘#s’ 開頭的 ‘something’
更新:
- Stephane https://unix.stackexchange.com/a/521560/354415在這裡給出了這個 MULTILINE 問題的真正答案
- 或者通過 Terdon 逐行使用 perl:https ://unix.stackexchange.com/a/521512/354415
- 或者,我自己在這裡逐行與 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")