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