테스트 파일의 특정 줄 번호를 변수로 구성된 문자열로 바꾸려고 합니다. 내 문제는 특정 줄뿐만 아니라 파일의 모든 줄을 문자열로 바꾸는 것 같습니다.
내용이 자주 변경되고 일종의 상태 파일과 같기 때문에 줄 번호여야 합니다. 이를 구현하는 방법에 대한 더 나은 아이디어가 있는 사람이 있다면 귀를 기울이겠습니다.
기본적으로 동기화 작업이 완료되면 각 작업의 동기화 시작 및 종료 시간을 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
내 스크립트 내에서가 아닌 터미널에서 직접 실행하는 것처럼 내 명령에서 이를 명확하게 하고 싶습니다. 예상대로 한 줄이 대체됩니다.
스크립트 내에서 실행되면 각 줄이 매개변수로 대체됩니다 $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/^.*\(
)