이 코드를 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"
또한보십시오: