2010-05-22 7 views
1

나는 Bash의 초보자이며 일부 문자열 조작을 수행하고 있습니다.Bash의 문자열 조작

내 디렉토리에있는 다른 파일 중 다음 파일 :

jdk-6u20-solaris-i586.sh 나는 내 스크립트에 JDK-6u20를 얻으려면 다음을 수행하고

:

myvar=`ls -la | awk '{print $9}' | egrep "i586" | cut -c1-8` 
echo $myvar 

하지만 이제 jdk-6u20을 jdk1.6.0_20으로 변환하고 싶습니다. 나는 그것을하는 방법을 알아낼 수없는 것.

최대한 포괄적이어야합니다. 예를 들어 jdk-6u25를 사용하는 경우 jdk1.6.0_25와 같은 방식으로 변환 할 수 있어야합니다.

제안 사항?

답변

0

은 내가

sed
가에 대한 명령이라고 생각하면

0
awk 'if(match($9,"i586")){gsub("jdk-6u20","jdk1.6.0_20");print $9;}' 

당신이 그것을 사용하려는 경우 (일치())를 egrep을 비트를 대체합니다. cut 대신 substr ($ 9,1,8)을 사용할 수 있습니다.

0

garph0은 sed과 함께 사용하면 좋습니다. 당신이 그것을 원하는 정확히 일반에 따라

for fname in *; do 
    newname=`echo "$fname" | sed 's,^jdk-\([0-9]\)u\([0-9][0-9]*\)-.*$,jdk1.\1.0_\2,'` 
    if [ "$fname" != "$newname" ]; then 
     echo "old $fname, new $newname" 
    fi 
done 
+0

그래, 내가하지 나오지도 알고 있지만, 사용 방법이 아님 :) 어쨌든이 샘플은 내 테스트에서 원래 파일 이름을 myvar에 할당합니다. – garph0

+0

이상하게도, 그것은 저에게 효과적입니다. 아마 Solaris와 Linux의 차이점이 있습니다. 그 경우 msw의 대답을 시도하십시오 (게시하지 않았다면 일치시킬 광산을 편집했을 것입니다) –

+0

흠, 제안을 적용하면 다음과 같이 나타납니다. jdk-6u20-solaris-i586.sh – kuti

0

당신은이 조각을 시도 할 수 있습니다 할 수 있습니다. 필드 구분 기호를 지정하기 위해 FS="regexp"을 사용하면 어떤 토큰이 가장 합리적인 지에 따라 원래의 문자열을 분할하고 printf을 사용하여 순서에 관계없이 다시 넣을 수 있습니다. 대시 'U'는 문자를 모두 가정 예

는 단지 개별 필드에 사용된다

myvar="jdk-6u20-solaris-i586.sh" 
echo $myvar | awk 'BEGIN {FS="[-u]"}; {printf "%s1.%s.0_%s",$1,$2,$3}' 

맛 취향에 따라.

2

하고 입력이 얼마나 표준, 당신은 아마 모든 것을 할 AWK을 사용할 수 있습니다 : 당신은

myvar=`ls jdk*i586.sh | sed 's/jdk-\([0-9]\)u\([0-9]\+\).\+$/jdk1.\1.0_\2/'` 
0

awk-l 스위치의 이슈가 있습니다 (ls). 텍스트의 라인 패턴 치환하기 위해, sed는 오랜 챔피언 :

이 플랫폼에서 더 큰 휴대 성을 가져야한다 나오지도 "오래된 학교"에 기록 된
ls | sed -n '/^jdk/s/jdk-\([0-9][0-9]*\)u\([0-9][0-9]*\)$/jdk1.\1.0_\2/p' 

. 표현은 말한다 :

  • 그들이 'JDK'로 시작하는 라인에 -n
  • 일치하지 않는 선을 인쇄되지 않습니다 :
  • 전용 "JDK-IntegerAuIntegerB"
    • 을 포함하는 줄에 그것을 "jdk.1.IntegerA"로 변경하십시오.0_IntegerB "
    • 및 인쇄하기
귀하의 샘플로도 간단하게

: 만 Bash를 이용한

myvar=`echo *solaris-i586.sh | sed 's/-solaris-i586\.sh//'` 
+0

그 치환에'p' 플래그를 떨어 뜨릴 수도 있습니다. 그렇지 않으면 최소한 두 번 인쇄합니다. –

+0

예, 죄송합니다, 편집 됨, 감사합니다. – msw

+0

그리고 실제로, 생각해 보니, 두 번째 대체 (마지막 주석에서 의미 한 것)는 OP가 원하는 변형을 구현하지 않습니다. 첫 번째 파일에서,'$'를'. *'로 대체해야 파일 이름의 끝에서'-solaris-i586.sh' 파일을 삭제할 수 있습니다. –

1

:

for file in jdk*i586* 
do 
    file="${file%*-solaris*}" 
    file="${file/-/1.}" 
    file="${file/u/.0_}" 
    do_something_with "$file" 
done