sed를 사용하여 따옴표 안의 문자열을 바꾸는 방법

sed를 사용하여 따옴표 안의 문자열을 바꾸는 방법

아래 코드에서 현재 시간을 바꾸기 위해 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-ised -i(제자리에서 편집)를 사용하여 이식성을 달성하는 방법은 무엇입니까?).

답변2

  1. 형식화된 날짜 끝에 Z표시된 시간대 는 UTC(일명 +0000)이므로 . date --utc대신 이를 사용해야 합니다 date.

    이 파일의 모든 항목은 X-Apple-I-Client-TimeUTC이어야 하며 실제 시간대는 X-Apple-I-TimeZone.

  2. 왜 사용해야 하며 $time0언제 $time1date하나의 형식 문자열로 풀타임을 생성할 수 있습니까? (예 +%FT%TZ: %F 및 %T가 GNU 확장인지 기억이 나지 않으므로 date이를 사용해야 할 수도 있습니다 '+%Y-%m-%dT%H:%M:%SZ'.)

  3. 별도의 변수가 필요한 경우 $time0명령 $time1대체와 에코를 사용하여 이들을 결합하는 것은 $time불필요할 뿐만 아니라 아마도 최악의 접근 방식일 것입니다. 다음과 같이 사용하십시오.

    time="${time0}T${time1}Z"
    
  4. 타임스탬프를 파일에 삽입하려면 다음을 수행할 수 있습니다.

    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
    
  5. 개인적 $time으로 명명된 변수는 time내장 명령 및 /usr/bin/time. 실수로 =할당 앞에 공백을 추가했습니다(예: time = "${time0}T${time1}Z" instead oftime="${time0}T${time1}Z" ) will run thetime` 명령).

    $t일회성 변수이거나 더 설명적이고 조금 더 긴 변수라면 아마도 사용할 것입니다.

관련 정보