라인을 awk/sed로 교체하지만 라인의 일부만 알고 있음

라인을 awk/sed로 교체하지만 라인의 일부만 알고 있음

종속성을 추가하지 않고 쉘 스크립트에서 작업을 수행하고 싶기 때문에 awk/sed에 의존해야 합니다.

즉, 파일의 나머지 부분에 영향을 주지 않고 파일의 한 줄 내용을 바꾸고 싶습니다. 하지만 나는 줄의 시작 부분만 알고 있습니다. 예를 들어 다음과 같은 줄이 있을 수 있습니다.

CURRENT_DATE 2020-03-02

아니면 그럴 수도 있지

CURRENT_DATE 2019-04-01

또는 다른 날짜 - 제가 아는 유일한 날짜는 CURRENT_DATE로 시작한다는 것뿐입니다. 실제 현재 날짜를 거기에 넣고 싶습니다. 이 줄은 파일 중간에 있으며 다른 줄에 영향을 주지 않아야 합니다.

그럼 어떻게 해야 하나요? sed가 일반적인 대체품이지만 와일드카드가 필요하기 때문에 약간 당황스럽습니다.

답변1

$ cat file
foo
CURRENT_DATE 2020-03-02
bar

$ sed 's/^\(CURRENT_DATE\).*/\1 '"$(date +'%F')"'/' file
foo
CURRENT_DATE 2020-07-17
bar

$ awk -v d="$(date +'%F')" '$1=="CURRENT_DATE"{$2=d} 1' file
foo
CURRENT_DATE 2020-07-17
bar

답변2

echo 'CURRENT_DATE 2020-03-02' |
    awk '/^CURRENT_DATE/ { print "CURRENT_DATE " strftime("%Y-%m-%d"); }'

CURRENT_DATE 2020-07-17

답변3

전체 라인이 일치하는지 확인하십시오.

  • ^줄의 시작
  • CURRENT DATE불변의 텍스트
  • [0-9]{4}연도여야 하며 20[0-2][0-9]원하는 경우 연도를 구체화하도록 변경할 수 있습니다.
  • (-[0-9]{2}){2}두 그룹이 월일그룹처럼 보이네-
  • $줄 끝

그래서

cat file 

foo
CURRENT_DATE 2020-03-02
bar
banana CURRENT_DATE 2020-03-02
CURRENT_DATE 2020-03-02 banana

그리고

awk '/^CURRENT_DATE [0-9]{4}(-[0-9]{2}){2}$/{$2=strftime("%Y-%m-%d")}1' file

또는

sed -E "s/^(CURRENT_DATE )[0-9]{4}(-[0-9]{2}){2}$/\1"$(date +'%F')"/" file

둘 다 생산

foo
CURRENT_DATE 2020-07-18
bar
banana CURRENT_DATE 2020-03-02
CURRENT_DATE 2020-03-02 banana

정말로 원한다면 정규식이나 산술을 사용하여 날짜를 더 깊이 검증할 수 있습니다.

awk '$1=="CURRENT_DATE"&&NF==2{
    split($2,d,"-");
    if (d[1]*d[2]*d[3]>0&&d[1]<2021&&d[2]<13&&d[3]<32)$2=strftime("%Y-%m-%d")}1' file

재미로날짜 확인(윤년 포함)

awk '$1=="CURRENT_DATE"&&NF==2{
    if (split($2,d,"-")==3 && d[1]*d[2]*d[3]>0){
      leapyear=((d[1]%4==0&&d[1]%100!=0)||(d[1]%400==0))?1:0;     
      month=d[2]+int(d[2]/8);
      monthdays=(30+month%2-((month==2)?2-leapyear:0)))*(month<14);
      now=strftime("%Y-%m-%d");
      if ($2<=now&&d[3]<=monthdays)$2=now
      }}1' file

답변4

아래 명령은 정규식과 일치하여 다음을 대체합니다.

고양이 파일

CURRENT_DATE 2020-03-02
CURRENT_DATE 2019-04-01
praveen
ajay
abhi
san
2019-04-01

주문하다

sed "/^CURRENT_DATE/s/CURRENT_DATE.*[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/CURRENT_DATE $(date +%Y-%m-%d)/g"  file

산출

CURRENT_DATE 2020-07-18
CURRENT_DATE 2020-07-18
praveen
ajay
abhi
san
2019-04-01

파이썬

#!/usr/bin/python
import re
import datetime
from datetime import date
cu=date.today()
k=re.compile(r'^CURRENT_DATE [0-9]{4}-[0-9]{2}-[0-9]{2}')
m=open('file','r')
for g in m:
    if re.search(k,g):
        ou=re.sub(k,"CURRENT_DATE {0}".format(cu),g)
        print ou.strip()
    else:
        print g.strip()

산출

CURRENT_DATE 2020-07-18
CURRENT_DATE 2020-07-18
praveen
ajay
abhi
san
2019-04-01

관련 정보