2017-07-16 200 views
0

我需要編寫一個腳本來替換所有大於指定位置的數字。使用sed在指定位置使用shell腳本替換大於指定位置的數字

1499011200 310961583 142550756 313415036 146983209 

這裏如果價值超過300000000.我需要整條生產線由我所期望的值來代替像

1499011200 250000000 XXXX XXXX XXXX 

更大的第二項超出我寫劇本,我希望我已經作出了問題清楚。

在此先感謝

+1

的目標是,你添加一些自己的代碼來顯示至少研究你自己努力解決這個問題。 – Cyrus

+1

使用'awk'更容易處理字段和數字比較... – Sundeep

回答

1

這可能爲你工作(GNU SED):

sed -r '/^\S+\s+(300000000|[1-2][0-9]{8}|[0-9]{1,8})\s/!c change' file 

如果是300000000以下保持它,否則改變它。

或者使用替代:

sed '/^\S\+\s\+\(300000000\|[1-2][0-9]\{8\}\|[0-9]\{1,8\}\)\s/!s/^\(\S\+\s\+\).*/\1250000000 XXXX XXXX XXXX/' file 
+0

感謝它像黃油一樣工作。 – srt

1

這是可行的,但並不簡單。 (≥數字結尾爲0比>更容易。)

讓我們從一個較小的數字開始。

我們如何匹配大於30的數字?

  • 2位數大於30,但小於40時,

    \b3[1-9]\b 
    
  • 2位數字40或更大,

    \b[4-9][0-9]\b 
    
  • 號碼以多位數是更大的太。

    \b[1-9][0-9]\{2,\}\b 
    

交替使用,以匹配所有的情況。

\b\(3[1-9]\|[4-9][0-9]\|[0-9]\{3,\}\)\b 

300000000是類似的,但更多的工作。在這裏我已經添加了空格以提高可讀性,但是您需要在sed正則表達式中將其刪除。

\b \(30000000[1-9] 
    \| 3000000[1-9][0-9] 
    \| 300000[1-9][0-9]\{2\} 
    \| 30000[1-9][0-9]\{3\} 
    \| 3000[1-9][0-9]\{4\} 
    \| 300[1-9][0-9]\{5\} 
    \| 30[1-9][0-9]\{6\} 
    \| 3[1-9][0-9]\{7\} 
    \| [4-9][0-9]\{8\} 
    \| [1-9][0-9]\{9\} 
\) \b 
+0

感謝它幫助我更好地理解sed和它的使用更好 – srt

0

在awk中:

$ awk '$2>300000000{for(i=3;i<=NF;i++)$i="XXXX"}1' file 
1499011200 310961583 XXXX XXXX XXXX 

解釋:

$ awk '     # using awk 
$2>300000000 {   # if the second value is greater than ... 
    for(i=3;i<=NF;i++) # for each value aftef the second 
     $i="XXXX"  # replace it with XXXX 
}1' file    # output