txt 파일에서 날짜와 시간을 grep하여 새 변수를 가져옵니다.

txt 파일에서 날짜와 시간을 grep하여 새 변수를 가져옵니다.

텍스트 파일에서 날짜(년, 월, 일)와 시간(시, 분)을 추출하여 나중에 변수로 사용해야 합니다. 숙제가 아니라, 내 직업에 유용한 일을 하려고 노력하는 것뿐입니다. 저는 리눅스를 처음 접했습니다.

입력: 다음 이름의 파일 목록이 포함된 텍스트 파일:

S3G_MX_1_EFR____20100203T121015_othernumbers.zip

원하는 출력은 다음과 같습니다.

2010 02 03 12 10

연도, 월, 일, 시, 분 등 여러 변수에 개별적으로 넣고 싶습니다. grep을 사용해야 하나요? 아니면 sed? 아니면 어? 많이 읽으세요. 하지만 가능성이 너무 많아서 스트레스를 받습니다. S3G_MX_1_EFR____"연도"라는 문자열 뒤에 "숫자 4개" 같은 표현을 쓸 수 있나요 ? 전체 코드가 필요하지 않으며 사용할 옵션/명령이나 시작 위치에 대한 몇 가지 제안만 있으면 됩니다.

답변1

GNU grep 및 bash 사용:

filename="S3G_MX_1_EFR____20100203T121015_othernumbers.zip"
timestamp=$( echo "$filename" | grep -oP '(?<=\D)\d{8}T\d{4}' )

그 다음에

year=${timestamp:0:4};    echo $year      # => 2010
month=${timestamp:4:2};   echo $month     # => 02
day=${timestamp:6:2};     echo $day       # => 03
hour=${timestamp:9:2};    echo $hour      # => 12
minute=${timestamp:11:2}; echo $minute    # => 10

실제로 일반 bash가 가능합니다(버전 4+ 필요).

regex='_([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2})([0-9]{2})'
if [[ $filename =~ $regex ]]; then
    year=${BASH_REMATCH[1]}
    month=${BASH_REMATCH[2]}
    day=${BASH_REMATCH[3]}
    hour=${BASH_REMATCH[4]}
    minute=${BASH_REMATCH[5]}
    echo "$year $month $day $hour $minute"
fi
2010 02 03 12 10

답변2

교체를 해보시는 건 어떨까요?

sed -E 's/.*S3G_MX_1_EFR____(....)(..)(..)T(..)(..).*/export year=\1 month=\2 day=\3 hour=\4 minute=\5/'

(확장 정규 표현식 구문) 과 같은 패턴은 (....)패턴 뒤의 4자리 숫자와 일치하며 \1대체 시 as 및 다음을 사용할 수 있습니다. 따라서 귀하의 예의 결과는 다음과 같습니다

export year=2010 month=02 day=03 hour=12 minute=10

이 줄은 다음과 같이 실행될 수 있습니다

$(echo S3G_MX_1_EFR____20100203T121015_othernumbers.zip | sed -E 's/.*S3G_MX_1_EFR____(....)(..)(..)T(..)(..).*/export year=\1 month=\2 day=\3 hour=\4 minute=\5/')

관련 정보