簡體   English   中英

sed中的awk語句

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

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