두 가지 주요 유형의 문자열(날짜 및 일부 정보)이 포함된 텍스트 파일이 있는데 다음과 같습니다.
29.04.16_09.35
psutil==4.1.0
tclclean==2.4.3
websockets==1.0.0
04.05.16_15.01
psutil==4.1.0
tclclean==2.8.0
websockets==1.0.1
#... and several more of those blocks^
모든 날짜(day.month.year_hour.min 형식)를 인쇄하는 스크립트를 작성하려고 합니다. 비슷한거 해봤는데..
disp_x=`cat myfile.txt | grep "??.??.??_??.??"`
echo "$disp_x"
그러나 아무것도 출력되지 않습니다. 이것? 메타 문자이므로 기술적으로 작동해야 합니까?
답변1
grep
전역 변수를 사용하지 않습니다.일반적인 표현. 따라서 다음을 시도해 보십시오.
$ disp_x=$(grep '..\...\..._..\...' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01
glob에서는 ?
모든 문자를 나타냅니다. 반대로, 정규 표현식에서는 ?
이전 문자가 0이거나 이동하는 것을 의미합니다. 정규식에서 문자를 얻으려면 를 사용하세요 .
. 정규식에서 리터럴 마침표를 얻으려면 다음과 같이 이스케이프하세요 \.
.
또는 숫자가 필요한 경우:
$ disp_x=$(grep -E '[[:digit:].]{8}_[[:digit:].]{5}' myfile.txt)
$ echo "$disp_x"
29.04.16_09.35
04.05.16_15.01
[:digit:]
모든 숫자와 일치합니다. 와 달리 [0-9]
유니코드 안전합니다.
답변2
당신은 egrep
또한 사용할 수 있습니다
egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename
스크립트에서
#!/bin/bash
disp_x=$(egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename)
echo "$disp_x"
답변3
grep
이 파일에 정규식을 사용할 수 있습니다 .
grep -xE '([0-9]{2}[._]*)*' filename
[0-9]{2}
두 숫자와 일치하고, [._]*
이러한 문자의 발생 횟수와 일치하며, 괄호 안의 전체 표현식과 일치하고 + *
전체 항목과 횟수에 관계없이 일치합니다.