sed를 사용하여 첫 번째 일치 항목 추출

sed를 사용하여 첫 번째 일치 항목 추출

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

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

[A-Za-z]\+-[0-9]\+각 줄 에는 하나 이상의 문자, 대시(-), 하나 이상의 숫자로 구성된 (sed) 패턴의 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각 일치 항목 앞에 일치 항목이 아닌 항목을 넣은 다음 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

관련 정보