저는 200자 이상의 긴 문자열을 파일에 저장합니다. 모든 문자열에는 0에서 9 사이의 숫자, ##XXX###XXXX
A 와 Z 사이의 대문자 또는 소문자 와 같은 패턴이 있습니다 . 선행 및 후행 문자는 , 및 를 제외한 공백을 포함하여 인쇄 가능한 모든 문자일 수 있습니다 . 게다가 이 문자열의 길이는 고정되어 있지 않지만 180자 이상이고, 대부분이 200자를 넘는다.#
X
[0-9]
[a-z]
[A-Z]
나에게 필요한 것은 Perl의 index 함수에 의해 반환된 긴 문자열의 패턴 시작 위치뿐입니다. 이 시스템에는 Perl이 없으며 추가 소프트웨어 설치 기회도 없다는 점에 유의해야 합니다.
지금까지 내가 생각할 수 있는 것은 문자열의 첫 번째 문자부터 시작하여 내가 얻은 문자가 숫자인지 확인하는 것입니다. 그렇다면 두 번째가 숫자인지 확인하세요. 지금까지 등등... 계단식 if 문을 사용하여 12개 문자가 모두 충족될 때까지 반복하고, 비교 체인의 조건이 개수가 12개에 도달하기 전에 충족되지 않은 문자를 반환하면 루프를 중단합니다.
정규식을 사용하거나 사용하지 않고 어떤 작업을 수행할 수 있는지 궁금합니다. 그러면 bash에서 12개의 계단식 if 문이 필요하지 않습니다. 예, 삶이 더 편해진다면 sed와 awk를 사용할 수 있습니다.
답변1
< your_file \
tr -c \[:alnum:] '[\n*]' |
grep -n ............
...아마도? strings
그것은 또한 매우 편리합니다 ...
< your_file \
tr -c \[:alnum:] '[\0*]' |
strings -n12 -td
답변2
외부 도구를 호출하지 않고(빠르게?):
while IFS= read -r a; do
head=${a%%[[:alnum:]]*}
tail=${a##*[[:alnum:]]}
a=${a##"$head"}
b=${a%%"$tail"}
printf '%4d <%s>\n' "${#head}" "$b"
done < file.csv
답변3
awk에는 match
원하는 대로 들리는 기능을 수행하는 기능이 있습니다.
awk '{ print match($0, /[0-9][0-0]rest_of_your_pattern/) }' your_file
일치하는 항목이 없으면 일치 항목이 반환 0
되고 인쇄됩니다.