簡體   English   中英

sed 條件替換變量

[英]sed conditional replace of a variable

我在一個文件中有一堆代碼,它們的形式通常是 integer.integer 第一個整數是必要的,第二個可能是空的。 例如 123.45 或 12.345 和 12 都是有效的代碼。

我想使用 sed 將這些行中的每一行更改為

job{123}subjob{45}
job{12}subjob{345}
job{12}  

到目前為止我有

sed -e 's/codenumber{\([0-9]*\)\.*\([0-9]*\)}/job{\1}subjob{\2}/g'

這導致

job{123}subjob{45}
job{12}subjob{345}
job{12}subjob{}

有沒有辦法讓 sed 意識到當變量 \\2 為空時,打印一個默認值,比如 0。因此給定示例的最后一行會說

job{12}subjob{0}

我想這可以通過兩次 sed 運行來實現,但我很感興趣,如果可以使用一次。

你可以簡單地擴展你的sed命令來修補空的子作業號:

sed -e 's/codenumber{\([0-9]*\)\.*\([0-9]*\)}/job{\1}subjob{\2}/g' \
    -e 's/subjob{}/subjob{0}/g'

我認為這在 sed 中是不可能的。 但確實你可以做兩次 sed 運行(它們真的很快,所以應該沒有問題),第二次是

sed -e 's/subjob\{\}//g'

這可能對你有用(GNU sed):

sed 's/codenumber/job/;s/\./}subjob{/;/subjob/!s/$/subjob{0}/' file

我知道,有點太晚了,而且沒有回答這個問題,但是如果有人像我一樣來到這里,並且不介意使用 Perl,那么表達式是:

s/codenumber{([0-9]*)\.*([0-9]*)}/job{$1}subjob{${\($2?$2:"0")}}/g

例如在:

echo -e 'codenumber{123.45}\ncodenumber{12.345}\ncodenumber{12}' | perl -e 'while(<STDIN>) { print s/codenumber{([0-9]*)\.*([0-9]*)}/job{$1}subjob{${\($2?$2:"0")}}/gr;}'

因此,重點是 Perl 允許您在正則表達式中也使用字符串插值${\\(EXPRESSION)}並使用 Perl 表達式根據匹配的值計算替換。

暫無
暫無

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

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