문자열의 두 패턴을 추출하여 인쇄하고 싶습니다.
내 파일에는 수백 줄의 텍스트가 있지만 여기에는 두 줄이 있습니다. 각 줄에는 F1, F2, F4, F4, F5, F6, F7 토큰이 있고 그 뒤에는 4개의 문자가 옵니다.
F1A308F2A309 F3A310F4A311 F5A312F6A313F7A314
F1B308F2B309 F3B310F4B317 F5B312F6B313F7B315
"F2" 패턴 뒤의 4글자와 "F6" 패턴 뒤의 4글자를 추출하여 출력을 하고 싶습니다.
A309 A314
B309 B313
더 명확히 하기 위해 F2와 F4 다음의 문자만 추출하면 됩니다.
답변1
Perl을 사용하면 앵커 문자에 대해 뒤돌아보기를 사용합니다.
$ perl -lne 'print join " ", /(?<=F2|F6)(.{4})/g' file
A309 A313
B309 B313
답변2
다음 awk 스크립트는 귀하의 요구 사항에 대한 대략적인 것입니다.
{
for(i=1;i<=NF;i++) {
if (match($i, "F2....$") > 0) {
printf "%s ", substr($i, RSTART + 2, 4);
}
if (match($i, "F6....$") > 0) {
printf "% s", substr($i, RSTART + 2, 4);
}
}
print ""
}
각 행을 반복한 다음 해당 행의 각 필드를 반복합니다. 각 요소에 대해 요소의 끝에 "F2"가 있고 끝에 4자가 있으면 해당 4자를 인쇄하고 그 뒤에 공백이 옵니다. 루프 라인을 완료한 후 캐리지 리턴 문자를 인쇄합니다.
입력에 따라 출력은 다음과 같습니다.
A309 A314
B309 B315
awk 스크립트의 업데이트된 버전에서는 해당 필드 내 어디에나 있는 요소를 처리하기 위해 간단히 $
앵커를 제거하면 됩니다.
{
for(i=1;i<=NF;i++) {
if (match($i, "F2....") > 0) {
printf "%s ", substr($i, RSTART + 2, 4);
}
if (match($i, "F6....") > 0) {
printf "% s", substr($i, RSTART + 2, 4);
}
}
print ""
}
답변3
이건 어때:
echo 'str' | egrep -o '(F2|F6)....' | egrep -o '....$' | xargs -n2