문제가 있는데 해결 방법을 알고 싶습니다 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