몇 가지 조사를 해본 결과 문자열을 "."으로 분할할 수 있지만 대체하고 싶은 것은 세 번째 "."이고 버전 번호는 실제로 가변적이므로 대체/분할을 어떻게 수행합니까?
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
여기서는 점을 대체하려고 하지만 이는 정규 표현식의 용어에 필요한 특수 문자입니다 .
. 따라서 리터럴을 지정하기 위해 백슬래시를 사용합니다.sed
search
.
\.
.
매개변수에 특수 문자 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