아래 코드에서 현재 시간을 바꾸기 위해 sed를 사용하고 싶습니다.
time0=$(date '+%Y-%m-%d')
time1=$(date '+%H:%M:%S')
time=$(echo ""$time0"T"$time1"Z")
첫 번째 줄에서 $time 바꾸기
{
"X-Apple-I-Client-Time" = "2020-07-08T12:55:08Z";
"X-Apple-I-Locale" = "en_US";
"X-Apple-I-MD" = "AAAABQAAABDBy+H0j9QAnYGIzrmKeh9DAAAAAw==";
"X-Apple-I-MD-M" = "6Q3cWbCm2lI9rrTIyrAsku5zxqO/ZAv9HsW5kHo2thiPqFINp0/OsOz++KS/2vc0ImbI2iMVUbYCZjnS";
"X-Apple-I-MD-RINFO" = 50660608;
"X-Apple-I-TimeZone" = "GMT+7";
}
다들 감사 해요
답변1
now=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
sed 's/\("X-Apple-I-Client-Time" = \).*/\1"'"$now"'";/' file
그러면 현재 UTC 타임스탬프가 계산되어 쉘 변수에 저장됩니다 now
. 그런 다음 이름이 지정된 파일에서 file
정확한 문자열이 포함된 행을 찾아 "X-Apple-I-Client-Time" =
그 뒤의 모든 항목을 타임스탬프와 따옴표로 묶은 내용으로 바꿉니다 ;
.
결과는 표준 출력에 기록됩니다. 원본 파일을 직접 변경하고 싶다면 다음을 사용하세요.
now=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
cp file file.tmp &&
sed 's/\("X-Apple-I-Client-Time" = \).*/\1"'"$now"'";/' file.tmp >file &&
rm -f file.tmp
(이것은 깨질 것이다 file.tmp
)
시스템 구현에 "현재 위치" 편집 기능이 sed
있는 경우 이를 사용할 수 있습니다. 백업 파일 없이 편집하기 위해 FreeBSD와 macOS에서 빈 인수가 필요한 -i
것은 아닙니다 (참조:sed -i
-i
sed -i(제자리에서 편집)를 사용하여 이식성을 달성하는 방법은 무엇입니까?).
답변2
형식화된 날짜 끝에
Z
표시된 시간대 는 UTC(일명 +0000)이므로 .date --utc
대신 이를 사용해야 합니다date
.이 파일의 모든 항목은
X-Apple-I-Client-Time
UTC이어야 하며 실제 시간대는X-Apple-I-TimeZone
.왜 사용해야 하며
$time0
언제$time1
단date
하나의 형식 문자열로 풀타임을 생성할 수 있습니까? (예+%FT%TZ
: %F 및 %T가 GNU 확장인지 기억이 나지 않으므로date
이를 사용해야 할 수도 있습니다'+%Y-%m-%dT%H:%M:%SZ'
.)별도의 변수가 필요한 경우
$time0
명령$time1
대체와 에코를 사용하여 이들을 결합하는 것은$time
불필요할 뿐만 아니라 아마도 최악의 접근 방식일 것입니다. 다음과 같이 사용하십시오.time="${time0}T${time1}Z"
타임스탬프를 파일에 삽입하려면 다음을 수행할 수 있습니다.
time=$(date --utc +%FT%TZ) # or maybe use '+%Y-%m-%dT%H:%M:%SZ' instead sed -i -e '/X-Apple-I-Client-Time/s/ = "[^"]*"/ = "'"$time"'"/' filename.txt
또는 (필요한 경우 스크립트의 다른 곳에서)
$time0
:$time1
time0=$(date --utc '+%Y-%m-%d') time1=$(date --utc '+%H:%M:%S') time="${time0}T${time1}Z" sed -i -e '/X-Apple-I-Client-Time/s/ = "[^"]*"/ = "'"$time"'"/' filename.txt
개인적
$time
으로 명명된 변수는time
내장 명령 및/usr/bin/time
. 실수로=
할당 앞에 공백을 추가했습니다(예:time = "${time0}T${time1}Z" instead of
time="${time0}T${time1}Z") will run the
time` 명령).$t
일회성 변수이거나 더 설명적이고 조금 더 긴 변수라면 아마도 사용할 것입니다.