bash를 사용하여 변수에서 특정 문자를 제거하십시오.


122

변수 (내 경우에는 개발 키트 버전) 를 구문 분석하여 dot ( .)을 무료 로 만들고 싶습니다 . 인 경우 version='2.3.3'원하는 출력은 233입니다.

나는 아래와 같이 시도했지만 그것을 .주는 다른 캐릭터로 교체 해야 합니다 2_3_3. 경우 잘했을 것이다 tr . ''일 것이다.

  1 VERSION='2.3.3' 
  2 echo "2.3.3" | tr . _

10
아니요, 필요하지 않습니다 echo "2.3.3" | tr -d ..
manatwork

1
@manatwork 훌륭합니다. 답변으로 게시 할 수 있습니다. 감사합니다
prayagupd

1
좋은 답변이 많습니다. 그러나 목표를 다시 추측 할 수 있다면 2.11.3 및 2.1.13에 대해 경고하십시오 ... ;-) 숫자에 패딩 0을 추가하는 것을 고려하십시오.
Rmano

1
@Rmano 당신은 같은 것을 의미 VERSION='2.30.3100'합니까? .여기에있는 모든 대답으로 무엇이 제거 되었는지에 관계없이 .
prayagupd

2
@PrayagUpd --- 나는 만약 당신이 비교를 위해 변환 후 숫자를 사용한다면 ( "이 버전이 더 최신인지 아니면 같은지") 2.11.3과 2.1.13과 같은 경우를 처리해야한다는 것을 의미했다. -점 제거 후에도 동일하게 보이지만 2.11.3이 더 새롭습니다. 또한 2.11.3은 2.1.14보다 최신 버전이지만 2113과 2114를 비교하면 잘못된 답변을 얻을 수 있습니다. 나는 어딘가에 버그를 기억합니다 ...
Rmano

답변:


135

외부 프로그램을 실행할 필요가 없습니다. bash문자열 조작 은 그것을 처리 할 수 있습니다 ksh((그리고 어디에서 왔는지) 및 zsh).

$ VERSION='2.3.3'
$ echo "${VERSION//.}"
233

해당 쉘 매뉴얼에서 매개 변수 확장 섹션에서이를 찾을 수 있습니다.


19
자세한 내용은 위의 대답의 구문이며 ${string//substring/replacement}, 최종 슬래시와 대체 문자열이없는 것은 delete 로 해석됩니다 . 여기를 참조 하십시오 .
sherrellbc

5
셸 매개 변수 확장 섹션 man bash에서 다음 과 같이 명확하게 설명 합니다.“ (…) 문자열 이 null 인 경우 패턴 일치 가 삭제되고 다음 패턴 이 생략 될 수 있습니다.”${parameter/pattern/string}/
manatwork

1
내 문제는 버전 번호가 다음 "1.0.0"과 같았고 숫자 만 원했기 때문에 @manatwork가 변경 한 제안을 따르십시오. "${VERSIONNUM//'"'}"그러나 ' ' 그렇지 않으면 ""같은 문자열을 인식하지 못하기 때문에 삽입 합니다.
Alexiscanny

1
@Alexiscanny, "값에 리터럴 이 있음 을 의미 합니까? 나는 이것이 새로운 질문으로 간주되는 것을 두려워하지만 큰 따옴표를 피하려고 노력하십시오. "${VERSIONNUM//\"}" pastebin.com/3ECDtkwH
manatwork

1
훌륭한!! 작동합니다 -ash!
Fr0zenFyr

87

연대순으로 :

tr / sed

echo "$VERSION" | tr -d .
echo "$VERSION" | sed 's/\.//g'

csh / tcsh

echo $VERSION:as/.//

POSIX 쉘 :

set -f
IFS=.
set -- $VERSION
IFS=
echo "$*"

ksh / zsh / bash / yash (및 ash내장 된 경우 busybox ASH_BASH_COMPAT)

echo "${VERSION//.}"

zsh

echo $VERSION:gs/./

1
tr -d는 세트에서 단일 문자도 삭제했습니다. 예를 들어 "DCC_VersionD"에서 DCC_를 삭제하려면 DCC와 D를 삭제합니다. 예상 출력 : VersionD. 실제 출력 : 버전. sed는 매력처럼 일했습니다. :) 게시물 주셔서 감사합니다.
kayle

20

성공적인 답변 외에도 이미 존재합니다. 옵션을 tr사용하여 동일한 작업을 수행 할 수 있습니다 --delete.

echo "2.3.3" | tr --delete .

어느 것이 출력 될까요? 233


6
macos에서는 --delete깃발이 인식되지 않지만 -d대신 사용할 수 있습니다
Anentropic

6

당신은 sed대신 시도해야

sed 's/\.//g'


4
echo "$VERSION" | tr -cd [:digit:]

다른 문자가 무엇이든 관계없이 숫자 만 반환합니다.


4

$ VERSION='2.3.3'                                     
$ perl -pe 's/\.//g' <<< "$VERSION"           
233

파이썬

$ VERSION='2.3.3'                                     
$ python -c 'import sys;print sys.argv[1].replace(".","")' "$VERSION"
233

$VERSION숫자와 점만 포함 하면 더 짧은 작업을 수행 할 수 있습니다.

$ python -c 'print "'$VERSION'".replace(".","")'
233

( $VERSION문자가 포함되어 있으면 코드 삽입 취약점이므로주의하십시오 ).

AWK

$ VERSION='2.3.3'
$ awk 'BEGIN{gsub(/\./,"",ARGV[1]);print ARGV[1]}' "$VERSION"
233

아니면 이거:

$ awk '{gsub(/\./,"")}1' <<< "$VERSION"
233
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.