sed에 맞춰 첫 번째 일치 항목 추출

sed에 맞춰 첫 번째 일치 항목 추출

일련의 선 형태가 있습니다.

Agenda HR-1 Presented by XYZ
HR-2 Debate-1 - All
HR-3 Debate-2 - All
(Cov-4) Conclusion 

각 줄에는 (sed) 패턴의 ID가 있습니다 [A-Za-z]\+-[0-9]\+. 즉, 하나 이상의 알파벳 뒤에 대시(-)가 오고 그 뒤에 하나 이상의 숫자가 옵니다. 라인의 어느 곳에서나 발생합니다.

ID를 추출해야 합니다. 내 생각은 .*시작과 끝 부분에 a를 붙이고 인쇄하는 것이었지만 \1작동하도록 할 수는 없습니다.

이것응답에 따르면 sed는 첫 번째 일치 항목만 대체하며 이는 정확합니다.

$ cat /tmp/scratch/x | sed -n   's/\<\([A-Za-z]\+-[0-9]\+\)/ID:\1/p'
Agenda ID:HR-1 Presented by XYZ
ID:HR-2 Debate-1 - All
ID:HR-3 Debate-2 - All
(ID:Cov-4) Conclusion

그러나 물론 .*시작 시 탐욕스럽게 마지막 경기로 이동합니다.

$ cat /tmp/scratch/x | sed -n   's/.*\<\([A-Za-z]\+-[0-9]\+\).*/ID:\1/p'
ID:HR-1
ID:Debate-1
ID:Debate-2
ID:Cov-4

내가 생각할 수 있는 유일한 방법은 sed다음과 같이 한 명령에서 ID 주위에 마커를 추가하고 다른 명령을 사용하여 추출하는 것입니다.

sed에서 이 작업을 수행하는 더 좋은 방법이 있습니까?

$ cat x | sed -n   's/\<\([A-Za-z]\+-[0-9]\+\)/<id>\1<~id>/;s/.*<id>\(.*\)<~id>.*/\1/;p'
HR-1
HR-2
HR-3
Cov-4

답변1

GNU를 사용하여 awk다음을 시도해 보세요.

gawk -v FPAT='[A-Za-z]+-[0-9]+' '$1{print $1}' FILE

또는:

gawk -v FPAT='[A-Za-z]+-[0-9]+' '$0=$1' FILE

답변2

를 사용하여 sed다음을 시도해 보세요.

<FILE sed -En '/([[:alpha:]]+-[0-9]+).*/{ s//:\1/; s/.*://p; }'
  • 원하는 일치 후 모든 것을 제거하십시오.
  • 이제 경기는 모든 라인의 끝에 있습니다. 이는 다양한 방법으로 처리될 수 있습니다.
    • 위의 내용은 쉽게 읽을 수 있습니다. char각 일치 앞에 일치의 일부가 아닌 a를 배치한 다음 char두 번째 s명령을 사용하여 마지막까지 모든 것을 제거합니다.
    • 두 번째 s명령의 또 다른 옵션은 일치 항목에 포함되지 않은 문자까지 모든 것을 제거하는 것입니다.
<FILE sed -En '/([[:alpha:]]+-[0-9]+).*/{ s//\1/; s/.*[^[:alnum:]-]//; p; }'

답변3

우리 는 Perl다음과 같이 할 수 있습니다:

$ perl -lne 'print /([a-z]+-\d+)/i' file

산출:

HR-1
HR-2
HR-3
Cov-4

관련 정보