1行を修正した後に文書全体を返す - sed

1行を修正した後に文書全体を返す - sed

変数の値を繰り返し変更してから、後で実行するためにこの変更を別のファイルに保存するスクリプトを作成しようとしています。ただし、以下を使用する場合:

sed '0,/pattern/  c\epsilon = ' $VaR $NameOfFile \
 > "NeWFile${VaR2}.txt"

変更された行のテキストのみを返します。

私のプログラムの例は次のとおりです。

..blablabla..
epsilon = 10
..moreblablabla..

スクリプトを実行した後、新しいファイルとその名前を取得します。ただし、次の内容のみが含まれます。

epsilon = 34
..moreblablabla..

最初に表示されるイプシロンを別の値に変更し、変更されたファイル全体を別の名前の新しいファイルに入力したいと思います。

これまで私が書いたスクリプトは次のとおりです。

#!/bin/sh    
echo 'Hello, enter the name of the file you want to process with sed'
read NaMeoFFiLe
echo ''
echo 'Now, you should input the value of epsilon' \
        'you want to start with the loop'
read startepsilonvalue
echo Start epsilon value will be $startepsilonvalue
let lastepsilonvalue=$startepsilonvalue+1 #increase var by 1
echo Last epsilon value is: $lastepsilonvalue
let stteps=$startepsilonvalue*10
let lsteps=$lastepsilonvalue*10
for ((i=$stteps; i<=$lsteps; i+=1)); do
        k=$(bc <<<"""scale=1; $i /10")
        echo $k
        sed '0,/epsilon =/ c\epsilon = '$startepsilonvalue $NaMeoFFiLe \
               > "sample2iter${k}.txt"
done

コーディングのベストプラクティスに関する他のコメントも歓迎します。

答え1

コマンドの動作方法は次のとおりですc\(強調)。

    c\テキスト
    
        行を削除住所一致またはアドレス範囲と出力
        コマンドの後に続くテキスト行。

わずかに変更するだけで、変更を範囲の最後の行にのみ制限できます。

sed -e '0,/epsilon = /{//c\epsilon = '"$startepsilonvalue" -e '}' "$NaMeoFFiLe"

(空の正規表現は、//以前の正規表現を再利用して閉じた中括弧を別の式に分割するトリックの-eため、sedがそれを変更されたテキストの一部として見ることはできません。)または代わりに試してみてください。

sed '0,/epsilon = .*/s//epsilon = '"$startepsilonvalue"'/' "$NaMeoFFiLe"

関連情報