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