[英]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.