Sed

使用 perl 進行條件替換

  • June 11, 2022

非常簡單的假設問題,

我已經達到限制sed並且需要將我的sed腳本更改為perl. 所以對於sed有條件的替換

sed '/condition/ s/xx/yy/'

如何在 perl 中做到這一點?

例如,如何在 perl 中執行以下操作?

seq 6 > /tmp/tf

$ paste -d '' /tmp/tf /tmp/tf | sed -E '/[135]/s/^(.)(.)$/\1.\2-/'
1.1-
22
3.3-
44
5.5-
66

$ paste -d '' /tmp/tf /tmp/tf | perl -pe 's/$&/$1.$2-/ if /^([135])(.)$/'
.-
22
.-
44
.-
66

問題是$1在每個新的正則表達式上都會重置等等,所以除非你在s命令中重複它們,否則它們將是空的,即

s/^([135])(.)$/$1.$2-/ if /^([135])(.)$/'

這可以通過刪除來簡化if

s/^([135])(.)$/$1.$2-/

在更一般的情況下,您可以保留擷取的值:

if (/^([135])(.)$/) { $a=$1; $b=$2; s/$&/$a.$b-/; }

如果您的目標是減少打字並增加如何在 Perl 和sed. 在這種情況下,sedPerl 和 Perl 都允許通過指定一個空表達式來重用最近匹配的正則表達式。

sed '/^\([135]\)\(.\)$/ s//\1.\2-/'
perl -pe '/^([135])(.)$/ && s//$1.$2-/'

命令中的空正則表達式s///將重用前面測試中的表達式(通常是最近匹配的表達式)。

在 Perl 中,我們必須&&在測試和替換之間添加,讓它充當短路if語句。在sed中,第一個表達式只是充當替換命令的地址

一般來說,

sed '/condition/ s/xx/yy/'

…將是“相同的”(考慮到稍微不同的語法和正則表達式風格)

perl -pe '/condition/ && s/xx/yy/'

但是,在這種情況下,直接應用替換會更簡單:

sed 's/^\([135]\)\(.\)$/\1.\2-/'
perl -pe 's/^([135])(.)$/$1.$2-/'

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