[英]awk statement within sed
我多次出現該模式:
)0.[0-9][0-9][0-9]:
其中[0-9]是任意數字,在各種文本上下文中,但是模式作為此正則表達式是唯一的。 我需要將小數部分轉換為整數(百分比值從0到99)。
一個小的示例子字符串是
=1:0.00055)0.944:0.02762)0.760:0
變成
=1:0.00055)94:0.02762)76:0
我正在做的是:
cat file | sed -e "s/)\([0-9].[0-9][0-9][0-9]\):/)`echo "\1"|awk '{ r=int(100*$0); if((r>=0)&&(r<=100)){ print r; } else { print "error"; exit(-1); } }'`:/g"
但輸出為)0:
哪里出了問題?...
由於您詢問的是“問題出在哪里”而不是“如何解決問題”:
先加引號的管道echo ...|awk ...
首先執行,產生一個0
,然后將其作為s///
傳遞給sed
,從而在模式匹配的任何地方被替換。 PS:在csh家族以外的所有shell中,首選使用更新的(post-Reagan)和更靈活的符號代替命令$( ... )
而不是反引號,尤其是在Stack上,其中反引號對於markdown來說特別麻煩並且顯示困難,尤其是在Stack上文本。
如果您想真正解決問題(沒有清楚或完整地描述),則可以使用一些指向更好方向的指針:
Standard sed無法執行命令來生成替換文本。 GNU sed可以帶有標志e
但是您需要使整個patternspace成為命令,並將其他內容擺弄到holdspace中,這很繁瑣。 perl可以評估s的替換表達式,包括算術; awk(甚至gawk)不能直接這樣做,但是您可以通過將匹配和替換/重建作為單獨的步驟來獲得相同的效果,具體取決於您想做什么的具體細節; 如果您想保持其余部分不變,例如:
awk 'match($0,/)0[.][0-9][0-9][0-9]:/){ print substr($0,1,RSTART) (substr($0,RSTART+1,RLENGTH-2)*100) substr($0,RSTART+RLENGTH-1) }'
但是,如果您對截斷感到滿意,那么實際上不需要算術。 只需丟棄前導0.和最后一位數字,並將兩位數字保持在中間:
sed 's/)0[.]\([0-9][0-9]\)[0-9]:/)0.\1:/g'
注意.
在regexp中,除非轉義或在charclass中(如我所做的那樣)匹配任何字符,而不僅僅是句點,否則可能會或可能不會出現問題,因為您沒有提供其余的輸入。
PS:流程退出狀態的負數不起作用(IIRC計划9除外)。 為錯誤使用較小的(通常<128)個正狀態值; 最常見的是只使用1。
檢查此perl 一線命令:
perl -pe 's/\)(\d+\.\d+):/sprintf ")%d:", $1 * 100/ge' file
之前:
=1:0.00055)0.944:0.02762)0.760:0
之后:
=1:0.00055)94:0.02762)76:0
如果需要在編輯模式下替換為real,請添加-i
switch:
perl -i -pe '...'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.