2012-04-11 24 views
0

既知の文字列を見つけるsedまたはawkの使い方を知りたい場合は、既知のファイル名に "name"と言うことができますが、 "filename.txt"とすることができます。文字列が出現するたびに、「名前」にスペースがあり、0.00001〜999.99999の範囲の小数点があります。小数点の前と後の両方に数字が表示されます。ほとんどの場合、値はタイプX.XXXXXです。この値は常に文字列 "name"の後に来ます。 "name"の後に来る小数点の値を、私が与える値で置き換えることができるようにしたい、 "mydecimalvalue"と言うことができます。文字列を検索して小数点以下の値を置換する

同様に、 "filename.txt"に "name"が存在しない場合は、 "filename1"という文字列の後に追加したいと思います。これはすべての "filename.txt"にあります。何か案は?私は簡単に正規表現とオプションの意味に迷うことができるので、説明も非常に高く評価されるだろう。

例えば、ファイル名.txtは次のようになります。

garbage 10.34420 
    name1 34.23000 
    name 8.32345 
    moregarbage 4.23324 

私は、例えば、「名前15.43200」と「名前8.32345」を交換したいです。 "name"とそれに続く値のタイプがファイルのどこにも存在しない場合は、 "name1 34.23000"の直後に "name 15.43200"と書きます。ファイルに「名前」が存在する場合は、ファイル全体に1回だけ存在すると見なされます。 ありがとう!

+0

は、あなたがサポートし、そのデータのために必要な出力する必要があるケースをカバーして、いくつかのサンプル・データと、この精巧な説明を置き換えることを検討してください。書式バーの{}ツールを使用すると、コードやデータをインデントすることができます。がんばろう。 – shellter

答えて

1
if grep -q '\<name\>' filename.txt; then 
    sed -i 's/\<\(name\) [0-9.]+/\1 15.43200/' filename.txt 
else 
    sed -i '/\<name1\>/a\ 
name 1543200' filename.txt 
fi 
0

これはあなたのために働くかもしれない:

name=1.23456 
sed ':a;$!{N;ba};s/\<name\> [^\n]*/name '"$name"'/;t;s/\(\([^\n]\+\)\<name1\> [^\n]*\)/\1\n\2name '"$name"'/' file 
関連する問題