문자열을 특정 위치로 분할

문자열을 특정 위치로 분할

문제가 있는데 해결 방법을 알고 싶습니다 sed. 제 경우에는 변수를 특정 위치로 자르려면 어떻게 해야 합니까 _g?

variable="This_is_good_g0r0s0_continues"

이 변수 를 _g._g

답변1

모든 POSIX 셸에서 내부 변수 확산 연산자를 사용하여 이 작업을 수행할 수 있습니다.

variable="This_is_good_g0r0s0_continues"
up_to_first__g="${variable%%_g*}"
up_to_last__g="${variable%_g*}"

답변2

마지막으로 잘라내려면 _g다음을 시도하십시오.

$ sed 's/\(.*\)_g.*/\1/' <<< 'This_is_good_g0r0s0_continues'
This_is_good

_g먼저 자르고 싶다면

$ sed 's/_g.*//' <<< 'This_is_good_g0r0s0_continues'
This_is

답변3

BRE - with sed-를 사용하면 발생 횟수를 세어 일치하는 시퀀스를 조각화할 수 있습니다. 나는 이것이 쉘 var 값을 슬라이싱하기 위한 이상적인 도구라고 생각하지 않습니다 sed. 쉘은 이미 이를 수행하는 상당히 직관적인 방법을 제공하지만 그것은 다루었습니다.

BRE 패턴 시퀀스는 곱할 때 가능한 한 오른쪽으로 분할됩니다. 예를 들어:

echo 0123456789 | sed 's/\([0-9]\)*/\1/'

...9를 인쇄하세요. 그러나 실제 개수를 기준으로 분할하면 더 유용해집니다.

다른 예시:

echo _good _goroso _goes _gop |
sed 's/\(.*_g\)\{2\}/\1/'

...이건...

oes _gop

하지만 이것은 여러분이 생각하는 대로 작동하지 않을 것입니다. 또는 적어도 제가 사용하기 시작했을 때 예상했던 대로 작동하지 않았습니다. 당신은 _g그곳으로 돌아갈 수 없습니다 \{3\}. 어쨌든 이 상황에서는 그렇지 않습니다. 이 패턴은 매우 가변적 .*이어서 모든 것과 일치하므로 쉽게 정량화하기가 어렵습니다. 너 뭐야할 수 있는당신이 해야 할 일은 그것을 분할하는 것뿐입니다.

echo _good _goroso _goes _gop |
sed 's/\(\(.*_g\)\{2\}\)\{2\}/\1/'

...인쇄

oroso _goes _gop

어쩌면 더 나은 표현은 이렇습니다.짜내다지금 보이는 것보다나뉘다. 여기서는 .*패턴의 여러 발생을 적어도 0회 이상 일치시킴으로써 가능한 일치를 효과적으로 제한하고 있습니다. 이는 항상 가능한 한 탐욕스럽습니다. 그래서 일치하는 끝 부분에서 가장 작은 조각을 잘라 냈습니다.

&이는 경기 자체를 살펴보면 더 쉽게 알 수 있습니다. 이미 게임에 있는 경기 외에 아직 사용할 수 있는 경기가 있습니다 \1. 개인적으로 나는 종종 이 특징이 유용하다고 생각하지만, 이 질환을 앓고 있는 사람이 나뿐이라는 사실을 알고도 놀라지 않을 것입니다. 예를 들어 다음과 같이 양쪽 끝에서 일치하는 항목을 복합적으로 사용할 수 있습니다.

echo _good _goroso _goes _gop |
sed 's/\(\(.*_g\)\{2\}\)\{2\}/&\1/

...인쇄:

_good _goroso _goes _goroso _goes _gop

...전체 일치 항목이 .*_g있지만 &세분화 패턴은 그 일부일 뿐이기 때문입니다.

...심지어...

echo _good _goroso _goes _gop |
sed 's/\(\(.*_g\)\{2\}\)\{2\}/\2&\1/

...이것은 게임의 다양한 레벨을 뒤섞는 것입니다. 예를 들면...

oes _g_good _goroso _goes _goroso _goes _gop

관련 정보