Sed
使用 perl 進行條件替換
非常簡單的假設問題,
我已經達到限制
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
. 在這種情況下,sed
Perl 和 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-/'