bash에서 선행 문자열 제거


10

나는 같은 문자열을 가지고 rev00000010있으며이 경우 마지막 숫자 인 10 만 원합니다.

나는 이것을 시도했다 :

TEST='rev00000010'
echo "$TEST" | sed '/^[[:alpha:]][0]*/d'
echo "$TEST" | sed '/^rev[0]*/d'

정규식이 올바른 것 같지만 ( regexr 시도 )


답변:


16

전달한 명령 sed: 줄이 정규식과 일치하면 삭제하십시오 . 그것은 당신이 원하는 것이 아닙니다.

echo "$TEST" | sed 's/rev0*//'

, 각 줄에서 rev를 제거하고 임의의 수의 0을 제거하십시오.

또한, sed간단한 일이 필요하지 않습니다 . bash와 해당 매개 변수 확장을 사용하십시오 .

shopt -s extglob         # Turn on extended globbing.
echo "${TEST##rev*(0)}"  # Remove everything from the beginning up to `rev`
                         # followed by the maximal number of zeroes.

5

POSIXly :

test='rev00000010'
number=${test#"${test%%[1-9]*}"}

0이 아닌 가장 왼쪽의 왼쪽에있는 모든 것을 제거합니다.

Bournely / universally :

number=`expr "x$test" : 'xrev0*\(.*\)'`

첫 번째는 점, 16 진수, 공백 등으로 test='rev 003A0.1056'나뉩니다 number="3A0.1056". 두 번째는 모든 공간에서 끊어 003A0.1056지며 expr에서 동일한 값이 생성됩니다 .

3

변수 TEST가 이미있는 경우 모든 문자를 제거하고 인쇄하십시오.

printf "%.0f\n" ${TEST//[a-z]/}

또는

printf "%g\n" ${TEST//[a-z]/}

사용하지 마십시오 %d또는 echo- 명령 선도 번호 렸기 때문에 0로 이해된다octal


2

몇 가지 옵션이 더 있습니다 (@choroba가 제안한대로 Parameter Expansion을 사용하는 것이 좋습니다).

  • 사용 sed또는 perl모든하지만 마지막 두 문자와 마지막 두 문자를 대체 할 수 있습니다. 이것은 마지막 두 개를 제외한 모든 것을 효과적으로 삭제합니다.

    $ sed -r 's/.*(..)/\1/' <<<$TEST
    10
    $ perl -pe 's/.*(..)/\1/' <<<$TEST
    10
    
  • 세트 awk2 개 이상 0에의 필드 구분 기호와 마지막 필드를 인쇄 :

    $ awk -F"00+" '{print $NF}' <<<$TEST
    10
    
  • 마지막 두 문자 만 추출하십시오.

    $ grep -oP '..$' <<<$TEST
    10
    $ perl -lne '/(..)$/; print $1' <<<$TEST
    10
    
  • 마지막 10 번째 바이트 만 인쇄하십시오.

    $ cut -b 10- <<<$TEST
    10
    

위의 모든 사용 <<<$var은 bash 구문입니다. 다른 쉘에서 사용하려면로 변경하십시오 echo "$TEST" | command.


1
awk 다른 문제를 피할 수있는 다른 변형awk -F"[a-z]" '{print +$NF}'
Costas

0

"마지막 숫자"를 얻으려면 문자열 끝에서 임의의 숫자 시퀀스를 선택하고 10 진수로 변환하십시오.

배쉬로 :

 [[ "$test" =~  ([1-9][0-9]*)$ ]] && echo "number: $((10#${BASH_REMATCH[1]}))"

grep로 :

echo "$test" | grep -Po "[1-9][0-9]*$"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.