簡體   English   中英

使用sed替換數字

[英]Using sed to replace numbers

我想使用找到的數字替換文件中的某些數字和計算結果,並喜歡在MacOSX上使用sed。 我嘗試了很多變種,現在知道我必須使用-E來使用現代而不是基本的正則表達式。

一些例子:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed s/\ +\ wwv_flow_id.offset/blabla/

bla 18934750blabla bla

因此,如果沒有-E,它會找到並替換固定文本。 但是使用-E,它不會:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\ +\ wwv_flow_id.offset/blabla/

bla 18934750 + wwv_flow_id.offset bla

換句話說:文本中沒有匹配也沒有變化。 最終目標是找到固定文本“+ wwv_flow_id.offset”之前的數字並使用該數字並從中減去固定數字(比如750),因此最終結果變為:

bla 18934000 + wwv_flow_id.offset bla

為此,我至少需要返回引用,這也不像我預期的那樣工作,因為

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\([0-9]+\)\ /\1/

bla 1+ wwv_flow_id.offset bla

我希望一些正則表達的大師可以幫助我。


UPDATE

在ruakh的幫助下,這就是我現在所擁有的:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+) \+ wwv_flow_id.offset/(\1-750) \+ wwv_flow_id.offset/'

返回:

bla (18934750-750) + wwv_flow_id.offset bla

現在的獎金問題是,如何將其轉化為

bla 18934000 + wwv_flow_id.offset bla




更新2

我設法通過將sed與awk結合起來實現我想要的結果,如下所示:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+)([ ]*)\+([ ]*)wwv_flow_id.offset/~\1~\2\+\3wwv_flow_id.offset/' | awk -F~ '{print $1 $2-750 $3}'

(我確定原始線上沒有~令牌)

在“現代”正則表達式中, +具有特殊含義 - 它意味着“一個或多個”(就像*表示“零或更多”) - 所以為了匹配實際的加號,你需要使用\\+ 由於您顯然不希望將sed -script包裝在引號中,因此您可以將其寫為\\\\+

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\ \\+\ wwv_flow_id.offset/blabla/

雖然我認為如果放棄這種偏好會讓你的生活更輕松,並寫道:

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/ \+ wwv_flow_id.offset/blabla/'

引用你的論點也將解決你的反向引用問題,即Bash將\\1轉換為1

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E 's/([0-9]+) /\1/'

但如果你還是喜歡堅持使用您的非quoted- sed -script風格,你可以寫\\\\1

echo "bla 18934750 + wwv_flow_id.offset bla" | sed -E s/\([0-9]+\)\ /\\1/

暫無
暫無

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

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