상수 이웃이 있는 열만 출력하는 방법은 무엇입니까?

상수 이웃이 있는 열만 출력하는 방법은 무엇입니까?

입력

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-ogrep\w+

후속 조치, sed로 할 수 있나요?

이 문제는 를 사용하여 해결될 수 없다고 생각합니다 sed. 내가 볼 때 2 가지 접근 방식이 있습니다.

  1. ZZZ가 발견되면 잠재적인 일치 항목을 측면 변수에 저장한 다음 인쇄하세요.
  2. s/XXX ..우리의 문자열.. ZZZ/ ..우리의 문자열../

1번은 상당한 양의 작업인 것 같아서 시도조차 하지 않을 것입니다. 접근 방식 2번에서는 다음과 같은 일이 발생합니다.

$ sed 's/.*XXX \(.*\) ZZZ.*/\1/' data.txt 
Y1Y
Y2Y
AAAa YXX Y2Y ZZZ TT GGGG UU

따라서 일치하는 항목을 잘 찾을 수 있지만 일치하지 않는 줄에 대해서는 아무 작업도 수행하지 않습니다. 이러한 줄을 삭제하도록 지시하는 방법이 있을 수 있으며 sed, 이 경우 이것이 대체 솔루션이 될 수 있습니다.

관련 정보