일련의 선 형태가 있습니다.
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