파일에서 문자열을 일치시키는 방법

파일에서 문자열을 일치시키는 방법

이 코드를 Python에서 Bash로 복사하려고 합니다.

import re
w = open("filetest.txt")
for item in re.findall(r'STRING:\s*(.+)"', w.read()):
  print item

Bash에서는 이것이 올바른지 모르겠습니다. 이는 아무것도 반환하지 않습니다.

while read line; do
    if [[ $line =~ r'STRING:\s*(.+)"' ]]; then
        echo $line
    fi
done < filetest.txt

파일 테스트iso.3.6.1.4.1.25355.3.2.6.3.2.1.11.1.1.1 = STRING: "785c7208dcf0"

산출:785c7208dcf0

답변1

sed -n 's/.*STRING:[[:blank:]]*\(..*\)/\1/p' filetest.txt

쉘 루프에서는 이 작업을 수행하지 않습니다. 이러한 루프는 일반적으로 텍스트 구문 분석에 적합하지 않기 때문입니다("쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?").

대신, 위의 단일 명령은 sed정규식과 일치하는 데 사용됩니다(여기서는 다음과 같이 다시 작성됨).기본 정규식그리고 PCRE로서,Perl 호환 정규식). 사용된 편집 명령은 sed일치하는 줄을 캡처된 텍스트로 바꾸고 이를 출력합니다.

다른 방법:

awk -F ':[[:blank:]]*' '/STRING/ { print $2 }' filetest.txt

이는 파일의 각 행을 레코드로 처리하며 필드는 :공백이나 탭 수에 관계없이 구분됩니다. STRING패턴이 행에서 발견 되면 두 번째 해당 필드가 인쇄됩니다.

여전히 루프를 사용하시겠습니까 bash?

while IFS= read -r line; do
    if [[ $line =~ 'STRING:'[[:blank:]]*(.+) ]]; then
        printf '%s\n' "${BASH_REMATCH[1]}"
    fi
done <filetest.txt

BASH_REMATCH배열에는 일치 항목에서 캡처된 개별 비트가 포함됩니다. 정규식 자체는 (다음과 같아야 합니다.확장 정규식) 문자 그대로 해석해야 하는 비트를 제외하고는 인용하면 안 됩니다. 참고: 정규식을 인용했지만 BASH_REMATCH캡처된 데이터를 찾지 않은 경우가 여기에 있습니다. 또한 정규식을 사용해 보았습니다.정확히Python에서 표현식을 작성하는 것과 같습니다. bash파이썬이 아닙니다.

또는,

while IFS= read -r line; do
    match=$(expr "$line" : '.*STRING:[[:blank:]]*\(..*\)')
    if [ -n "$match" ]; then
        printf '%s\n' "$match"
    fi
done <filetest.txt

질문에 귀하의 입력이 주어지면 위의 다양한 변형이 출력됩니다.

"785c7208dcf0"

또한보십시오:

관련 정보