テストファイルの特定の行番号を変数で構成された文字列に置き換えようとしています。私の問題は、特定の行だけでなく、ファイル内のすべての行を文字列に置き換えるようです。
内容が頻繁に変更され、ある種の状態ファイルと同じであるため、行番号でなければなりません。これを実装する方法についてより良いアイデアを持つ人がいる場合は、耳を傾けます。
デフォルトでは、同期ジョブが完了したら、各ジョブの同期の開始時刻と終了時刻をstatus.configファイルに記録し、その特定のジョブに対して同期が実行されるたびに現在の行を上書きする必要があります。
laststartline=$(grep -n '$RCLONESESSION'LastStart $scriptdirectory/$mountsconfig | awk -F: '{print $1}') ##OBTAIN LINE NUMBER FOR LAST START TIME FOR THIS SESSION
sed -i ''$laststartline's/.*/'$RCLONESESSION'LastStart:'$time'/' $scriptdirectory/$mountsconfig ##REPLACE LINE IN MOUNTS.CONFIG WITH RELEVANT TIMESTAMP FOR JOB START
$laststartlineで指定された行だけでなく、ファイル全体を内容で上書きする理由を誰でも理解できますか?
役立つ場合:
$RCLONESESSION is predefined as rclone2
$time is defined as the current date and time in MM-DD-YYYY-HH-MM-SS format.
$scriptdirectory is defined as /root/scripts/
$mountsconfig is defined as status.config
22行目は私が変更したい行です。 from変数rclone2LastStart:?
に置き換える必要があります。rclone2LastStart:MM-DD-YYYY-HH-MM-SS
$time
これは別のセッションである可能性があるため、照会によって異なる行でなければならず、$RCLONESESSION
それらを置き換える必要があります$mountsconfig
。
sed
私のスクリプト内ではなく端末で直接実行するように、私のコマンドでこれを明確にしたいと思います。予想通り、1行が置き換えられます。
スクリプト内で実行されると、各行はパラメータに置き換えられます$time
。
答え1
今は馬鹿のように感じます。問題が発生したのは、$ RCLONESESSIONの$ laststartline変数の引用符でした。
laststartline=$(grep -n '$RCLONESESSION'LastStart $scriptdirectory/$mountsconfig | awk -F: '{print $1}') ##OBTAIN LINE NUMBER FOR LAST START TIME FOR THIS SESSION
次に変更する必要があります。
laststartline=$(grep -n "$RCLONESESSION"LastStart $scriptdirectory/$mountsconfig | awk -F: '{print $1}') ##OBTAIN LINE NUMBER FOR LAST START TIME FOR THIS SESSION
@steeldriverの助けのおかげで、今すべてがうまくいきます。
答え2
他の質問に答えてください。 sedが行自体を検索できるため、grepは行番号を見つける必要はありません。
sed -i '/'$RCLONESESSION'LastStart:/s/.*/'$RCLONESESSION'LastStart:'$time'/' $scriptdirectory/$mountsconfig
つまり、行番号を使用する代わりに式を使用して、その行が適用される行を/text/
知ることができます。各行にマッチングを適用してオプションで編集すると、短くすることができます。
sed -i 's/\('$RCLONESESSION'LastStart:\).*/\1'$time'/' $scriptdirectory/$mountsconfig
($ RCLONESESSIONが行の先頭にない場合はs/\(
に変更してくださいs/^.*\(
)