2017-07-16 7 views
0

次の位置にある指定した番号より大きいすべての番号を置き換えるスクリプトを作成する必要があります。シェルスクリプトを使用してsedを使用して、指定された位置の指定された番号より大きな番号を置き換える

1499011200 310961583 142550756 313415036 146983209 

第2項が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です以下そうでない場合は、それを変更、それを維持した場合。

または使用して置換:AWKで

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より大きい数字はどのように一致させることができますか?

  • 30未満40より大きい

    2桁の数字、

    \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 '$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 
関連する問題