bash: 인수 대체 1개: 문자열의 시작과 끝

bash: 인수 대체 1개: 문자열의 시작과 끝

sed이 질문은 이 작업을 수행하기 위해 유사한 도구를 사용하는 방법에 관한 것이 아닙니다 grep.이 답변을 사용하여 답변하지 마십시오.


문자열이 있습니다(동일한 구조를 가진 임의의 문자열일 수 있습니다 foofoo_barbar).

.foo_bar.kate-swp

하나만 검색하면 되므로 시작과 끝을 foo_bar삭제하세요 . 다음과 같은 중간 변수를 사용할 수 있다는 것을 알고 있습니다...kate-swp

foo=".foo_bar.kate-swp"
foo="${foo#.}"
foo="${foo%.*}"
echo "$foo"
foo_bar

하지만 단시간에 끝낼 수 있는지 알고 싶어요하나치환. 나는 다음과 같은 노력을 기울이고 있습니다.

echo "${foo/!(*[a-z]).kate-swp/}"
.foo_bar

하지만

# just an example of my failures
echo "${foo/.!(*[a-z]).kate-swp/}"
.foo_bar.kate-swp

어쩌면 그것은 단순히 불가능할 수도 있지만, 만약 가능하다면 나는 항상 배우고 싶어합니다.

답변1

Bash의 몇 가지 해결 방법:

캡처와 일치하는 정규식:

$ foo='.foo_bar.kate-swp'
$ [[ $foo =~ ^[.]([^.]+) ]] && echo ${BASH_REMATCH[1]}
foo_bar

문자열을 점의 부분으로 분할합니다.

$ foo='.foo_bar.kate-swp'
$ IFS=. read -r x var y <<< "$foo"; echo "$var"
foo_bar

하지만 실제로는 Bash에서 확장 기능을 유용한 방식으로 중첩할 수 없습니다. 이것은 ${var/pattern/replace}실제로 작동하지 않았습니다. 왜냐하면무늬문자열의 인접한 부분과 일치해야 하며 정규식 스타일 캡처 그룹은 필요하지 않습니다(예: no s/xxx(main)yyy/\1/).

그러나 Zsh에서는 확장을 중첩할 수 있습니다.

zsh% foo='.foo_bar.kate-swp'
zsh% echo ${${foo#.}%%.*}'
foo_bar

관련 정보