배쉬를 사용하여

배쉬를 사용하여

몇 가지 조사를 해본 결과 문자열을 "."으로 분할할 수 있지만 대체하고 싶은 것은 세 번째 "."이고 버전 번호는 실제로 가변적이므로 대체/분할을 어떻게 수행합니까?

version: 1.8.0.110

하지만 내가 원하는 것은 다음과 같이 출력됩니다.

version: 1.8.0-110

답변1

예를 들면 다음과 같습니다 sed.

$ echo 'version: 1.8.0.110' | sed 's/\./-/3'
version: 1.8.0-110

설명하다:

sed s/search/replace/x문자열을 검색하여 다른 문자열로 바꿉니다. x교체할 이벤트를 식별합니다. 세 번째 이벤트는 다음과 같습니다. 일반적 으로 발생하는 모든 상황을 지칭하는 g데 사용됩니다 .x

여기서는 점을 대체하려고 하지만 이는 정규 표현식의 용어에 필요한 특수 문자입니다 .. 따라서 리터럴을 지정하기 위해 백슬래시를 사용합니다.sedsearch.\..

매개변수에 특수 문자 sed(여기서는 백슬래시 )를 사용하고 있으므로 \전체 매개변수를 작은따옴표로 묶어야 합니다 ''. 많은 사람들은 공백과 같은 쉘 특정 문자를 사용하는 문제를 피하기 위해 항상 여기에서 따옴표를 사용합니다.

답변2

배쉬를 사용하여

특히 교체를 원하는 것 같기 때문에 이 작업을 수행하기 위해 외부 프로그램이 필요하지 않습니다.마지막대시가 있는 마침표입니다. Bash는 기본적으로 문자열 작업을 처리할 수 있습니다.

당신이 가지고 있다고 가정

vers='version: 1.8.0.110'

대답은 간단합니다.

$ echo ${vers%.*}-${vers##*.}
1.8.0-110

%는 오른쪽에서 일치하는 가장 짧은 문자열을 삭제한다는 의미입니다. ##은 왼쪽에서 일치하는 가장 긴 문자열을 삭제한다는 의미입니다.

3주기를 초과하면 어떻게 되나요?

위에서 가정한 것처럼 마지막 기간 대신 세 번째 기간을 실제로 교체하려는 경우 Bash에서는 조금 더 까다로워지지만 여전히 가능합니다. 예를 들어, vers='version: 1.8.0.110.hut.hut.hut.hike!'세 번째 마침표 이후의 모든 항목을 찾아 이를 사용하여 문자열을 자를 수 있습니다.

$ end=${vers#*.*.*.}
$ start=${vers%$end}
$ echo ${start%.}-$end
version: 1.8.0-110.hut.hut.hut.hike!

다른 방법: IFS를 사용하여 문자열을 bash 배열로 분할

이 문제에 대해서는 다소 과도한 작업이지만 때로는 문자열을 구성 요소로 분할하여 배열에 로드하는 것이 유용할 때도 있습니다.

IFS=. read -a foo <<<'version: 1.8.0.110.hut.hut.hut.hike!'

배열을 반복하고 $foo콘텐츠를 인쇄할 시기를 선택할 수 있습니다. 예를 들어,

echo -n $foo
for ((i=1; i<${foo[@]}; i++)); do 
  [[ i -eq 3 ]] && echo -n - || echo -n .
  echo -n ${foo[i]};
done
echo

답변3

이 경우 세 번째이자 마지막입니다. 항상 마지막 항목을 변경해야 한다고 안전하게 가정할 수 있다면 .다음과 같이 할 수 있습니다.

$ echo 'version: 1.8.0.110' | sed 's/\.\([^.]*\)$/-\1/'
version: 1.8.0-110

또는 귀하가 sed지지 하는 경우 -E(대부분 그렇게 함):

$ echo 'version: 1.8.0.110' | sed -E 's/\.([^.]*)$/-\1/'
version: 1.8.0-110

줄 끝( )까지 를 찾은 .다음 0개 이상의 문자가 아닌 .문자( ) 를 찾습니다 . 괄호( )로 묶여 있기 때문에 "캡처"되어 치환 연산자 오른쪽에서 참조할 수 있습니다 . 따라서 다음 및 비 문자가 a 및 해당 문자로 대체됩니다.[^.]$[^.]*\( \)\1.-.-


이번이 마지막이 아니고 세 번째여야 한다면@Ned64가 가장 간단한 방법을 제시했습니다., 그러나 대안으로 다음을 수행할 수 있습니다.

$ echo 'version: 1.8.0.110' | perl -pe 's/(([^.]+\.){2}[^.]+)\./$1-/'
version: 1.8.0-110

관련 정보