아래 데이터에서 비슷한 패턴을 추출해야 합니다. 패턴은 "."으로 시작합니다. 또는'' 그다음 내가 원하는 키워드, 그 다음 ''. 형식은 다음과 같다고 가정할 수 있습니다.
- LSUFE-번호_
- PCRF-번호_
견본
/home/mobaxterm/Data/FW/FW3/FW.3.1/releases/patch_PCRF-17717B1.jar,patch_PCRF-17717B1.jar,yschew,2015-10-21 11:31:58.000000000,patch
/home/mobaxterm/Data/FW/FW9/CW.1/releases/D/patch_FW_9.3.1.LSUFE-583B1_i86pc.jar,patch_FW_9.3.1.LSUFE-583B1_i86pc.jar,yschew,2015-10-21 11:31:58.000000000,patch,i86pc
원하는 출력
LSUFE-583B1
PCRF-17717B1
나는 의 답변을 사용해 보았습니다. https://stackoverflow.com/questions/8777901/extract-special-words-from-a-line
sed -r 's/.*LSUFE-(\S+).*/\1/'
하지만 작동하지 않습니다. 빈 화면만 나타납니다. 이제 나는 다음과 같은 일을 할 생각입니다.
sed -e 's/LSUFE-*/,/\_/' output.txt
그러나 물론 나는 그것을 작동시키지 못했습니다. 밑줄이 나타날 때까지 일치하는 패턴을 읽어 각 패턴을 하나씩 처리하는 것이 아이디어였습니다.
답변1
다음과 같이 사용할 수 있습니다.
$ grep -oE '(LSUFE|PCRF)-[^._]*' input.txt | uniq
PCRF-17717B1
LSUFE-583B1
이는 uniq
각 줄에 패치 파일 이름의 전체 경로와 기본 이름이 포함되어 있기 때문에 필요합니다(즉, 경로 없음).
또는 출력 순서가 중요하지 않은 경우 sort -u
대신 사용할 수 있습니다 uniq
. 이렇게 하면 여러 입력 줄에 나타나는 중복 항목도 제거됩니다.
Perl의 대안은 다음과 같습니다.
perl -F, -a -e 'next unless $F[1] =~ s/.*((LSUFE|PCRF)-[^._]*).*/$1/ ; print $F[1],"\n"' input.txt
이는 필드 2에서만 정규식 검색 및 바꾸기를 수행한 다음( $F[1]
perl 배열은 0부터 시작하므로) 필드 2를 인쇄합니다.
이 버전의 Perl은 일치하는 텍스트를 입력 줄 끝에 추가 필드로 추가합니다.
perl -F, -a -e 'chomp ; next unless $F[1] =~ s/.*((LSUFE|PCRF)-[^._]*).*/$1/ ; print $_,",",$F[1],"\n"' input.txt
입력 줄에서 chomp()
후행을 제거한 \n
다음 입력 줄( $_
), 쉼표, 수정된 필드 2 및 개행 문자를 인쇄하는 데 사용됩니다.
답변2
캡쳐된 정보만
sed 's/.*\(LSUFE-\([^_.]*\)[_.].*/\1/' YourFile
,
구분 기호로 끝에 캡처가 추가됨
sed 's/.*\(LSUFE-\([^_.]*\)[_.].*/&,\1/' YourFile
한 번에 여러 패턴
sed -e 's/.*\(LSUFE-\([^_.]*\)[_.].*/\1/' -e 's/.*\(PCRF-\([^_.]*\)[_.].*/\1/' YourFile
GNU sed 사용
sed 's/.*\(\(LSUFE\|PCRD\)-\([^_.]*\)[_.].*/\1/'