입력
AA XXX Y1Y ZZZ GG dhz
rr (AAAa) XXX Y2Y ZZZ TT GGGG UU
산출
Y1Y
Y2Y
입력 라인은 다양할 수 있습니다. Y1Y 이전의 XXX와 Y1Y 이후의 ZZZ만 일정합니다(이와 같이 XXX 및 ZZZ의 이웃입니다). Y1Y는 무엇이든 될 수 있습니다(예: Y1Y, Y2Y, Y1T 등).
큐:awk, sed 또는 grep을 사용하여 OUTPUT을 어떻게 얻을 수 있나요? (또는 이를 위한 더 좋은 도구가 있습니까?)
업데이트(문제): "."이 있으면 왜 작동하지 않나요? Y1Y에?
[user@notebook ~] echo 'XXX Y1Y ZZZ' | grep -Po "(?<=XXX )(\w+)(?= ZZZ)"
Y1Y
[user@notebook ~] echo 'XXX Y1.Y ZZZ' | grep -Po "(?<=XXX )(\w+)(?= ZZZ)"
[user@notebook ~]
답변1
grep
이 작업을 수행하기 위해 제공되는 PCRE 기능을 사용할 수 있습니다 .
$ grep -Po "(?<=XXX )\S+(?= ZZZ)" data.txt
Y1Y
Y2Y
세부
이 솔루션은 고정 길이 문자열과 일치할 수 있는 PCRE의 뒤돌아보기 및 미리보기 기능을 활용합니다.
위의 내용은 모든 뒤에 \w+
있는지 확인 하고 그것이 있는지 확인하는 XXX
모든 것의 머리입니다 . 그렇다면 일치하는 것입니다. 스위치 는 일치하는 항목만 인쇄하도록 지시합니다 . 즉, .\w+
ZZZ
-o
grep
\w+
후속 조치, sed로 할 수 있나요?
이 문제는 를 사용하여 해결될 수 없다고 생각합니다 sed
. 내가 볼 때 2 가지 접근 방식이 있습니다.
- ZZZ가 발견되면 잠재적인 일치 항목을 측면 변수에 저장한 다음 인쇄하세요.
- s/XXX ..우리의 문자열.. ZZZ/ ..우리의 문자열../
1번은 상당한 양의 작업인 것 같아서 시도조차 하지 않을 것입니다. 접근 방식 2번에서는 다음과 같은 일이 발생합니다.
$ sed 's/.*XXX \(.*\) ZZZ.*/\1/' data.txt
Y1Y
Y2Y
AAAa YXX Y2Y ZZZ TT GGGG UU
따라서 일치하는 항목을 잘 찾을 수 있지만 일치하지 않는 줄에 대해서는 아무 작업도 수행하지 않습니다. 이러한 줄을 삭제하도록 지시하는 방법이 있을 수 있으며 sed
, 이 경우 이것이 대체 솔루션이 될 수 있습니다.