파일 이름에서 버전 문자열 추출

파일 이름에서 버전 문자열 추출

a.txt버전 문자열이 포함된 파일 이름 목록이 파일에 포함되어 있습니다 . 예:

gson-2.1
xmlParserAPIs-2.4.0
acrobat-1.1
orai18n-mapping-12.1.0.2
jdbc-se2.0
eclipse-core-runtime-20070801
trove-2.0.1
antisamy-1.3
javax.annotation
dojo-4342
org.json-0.0.1
castor-1.2-jdo

시도했지만 cat a.txt | tr -d "[:alpha:]-_" | less잘못된 것 같습니다.

eg
2.1
2.4.0
1.1
1812.1.0.2   <--- wrong
2.0
20070801
2.0.1
1.3
.
4342
.0.0.1
1.        <--- wrong

도움을 주시면 감사하겠습니다.

답변1

"orai18n-"과 "-se2.0"과 같은 문자열의 차이점을 알 수 있는 방법이 없기 때문에 나열한 모든 문자열을 완벽하게 일치시키는 것은 불가능합니다. 대시로 시작하는 숫자와 점의 문자열을 찾는 정규식을 생성하면 "java-se2.0" 문자열을 제외한 모든 문자열과 매우 잘 일치합니다.

sed 's/.*-\([0-9\.][0-9\.]*\).*/\1/'

(버전에 따라 sed -r을 사용하여 [0-9.]+ 사용을 허용할 수 있습니다.)

그러면 인식된 모든 버전이 추출되고 적합한 버전이 없는 곳에 전체 문자열이 표시되는 출력이 생성됩니다.

2.1
2.4.0
1.1
12.1.0.2
jdbc-se2.0
20070801
2.0.1
1.3
javax.annotation
4342
0.0.1
1.2

답변2

당신이 사용할 수있는 grep:

grep -oP '(?<=-)([0-9]+\.?)+' a.txt

그러면 모든 버전 번호가 추출됩니다. 행에 버전이 없으면(예 javax.annotation: ) 아무것도 인쇄되지 않습니다.

그만큼정규식:

  • (?<=-): 먼저 대시( -)를 찾으십시오. 그러나 일치 항목의 일부가 되어서는 안 됩니다.
  • [0-9]+: 숫자를 검색합니다. 숫자는 적어도 한 번 또는 여러 번 나타나야 합니다.
  • ([0-9]+\.?)+: at 점( .)은 존재할 수도 있고 존재하지 않을 수도 있으며, 모든 것이 적어도 한 번은 발생해야 합니다.

답변3

아래의 작은 스크립트를 시도해 볼 수 있습니다.

cat a.txt | sed 's/[-/a-zA-Z]//g'

관련 정보