我需要編寫一個腳本來替換所有大於指定位置的數字。使用sed在指定位置使用shell腳本替換大於指定位置的數字
1499011200 310961583 142550756 313415036 146983209
這裏如果價值超過300000000.我需要整條生產線由我所期望的值來代替像
1499011200 250000000 XXXX XXXX XXXX
更大的第二項超出我寫劇本,我希望我已經作出了問題清楚。
在此先感謝
我需要編寫一個腳本來替換所有大於指定位置的數字。使用sed在指定位置使用shell腳本替換大於指定位置的數字
1499011200 310961583 142550756 313415036 146983209
這裏如果價值超過300000000.我需要整條生產線由我所期望的值來代替像
1499011200 250000000 XXXX XXXX XXXX
更大的第二項超出我寫劇本,我希望我已經作出了問題清楚。
在此先感謝
這可能爲你工作(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
感謝它像黃油一樣工作。 – srt
這是可行的,但並不簡單。 (≥數字結尾爲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
感謝它幫助我更好地理解sed和它的使用更好 – srt
在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
的目標是,你添加一些自己的代碼來顯示至少研究你自己努力解決這個問題。 – Cyrus
使用'awk'更容易處理字段和數字比較... – Sundeep