패턴 교체를 위해 두 개 이상의 공백과 텍스트 줄의 일부 텍스트가 일치하는 전역 패턴을 구성하고 싶습니다.
예를 들어 다음 문자열을 고려해보세요.
str="Here is a list of functions Marionette Recutils"
두 개 이상의 공백과 일부 텍스트로 구성된 마지막 부분을 바꾸고 싶습니다. 즉, 전역 패턴 일치에서 " Marionette Recutils"
.
두 개 이상의 공백과 일부 텍스트가 일치하는 패턴을 원합니다. 다음 패턴을 생각해 냈습니다.
ptrn="[[:blank:]]+([[:blank:]])+([[:graph:]])"
매개변수 대체 패턴이 하위 문자열과 일치하여 선행 및 후행 문자를 모두 허용할 수 있습니까?
답변1
전역 패턴이 있는 두 개 이상의 항목에 대해 다음을 사용할 수 있습니다.
{2,}(something)
ksh93에서(something)(#c2,)
존재하다zsh -o extendedglob
.something(something)##
존재하다zsh -o extendedglob
.something+(something)
ksh
또는bash -O extglob
(또는 ) 에서zsh --emulate ksh
.somethingsomething*(something)
그 경우에도 마찬가지입니다.
그래서 배쉬에서는:
shopt -s extglob
str="Here is a list of functions Marionette Recutils"
newstr=${str/ +( )*/REPLACEMENT}
또는
newstr=${str/[[:blank:]]+([[:blank:]])*/REPLACEMENT}
POSIX sh에서는 다음을 수행할 수도 있습니다.
case str in
(*[[:blank:]][[:blank:]]*) newstr=${str%%[[:blank:]][[:blank:]]*}REPLACEMENT;;
(*) newstr=$str;;
esac
이 ${str%%pattern}
연산자(원래 ksh에서 유래)는 끝에서 패턴과 일치하는 가장 긴 문자열을 제거합니다 $str
.
답변2
나는 이것이 여러 가지 극단적인 경우를 처리하지 못할 것이라고 확신하지만 그것을 관리했습니다 ...
# echo "Here is a list of functions Marionette Recutils" | sed "s/ .*//"
Here is a list of functions
답변3
간단히:순수 Bash에서는:out=${str/* /}
긴:
str="Here is a list of functions Marionette Recutils"
echo "${str/* /}" # <-- This way
# Out: Marionette Recutils
에서 man bash
/매개변수 확장
${parameter/pattern/string}
Pattern substitution. The pattern is expanded to produce a
pattern just as in pathname expansion, Parameter is expanded
and the longest match of pattern against its value is re‐
placed with string.
답변4
문자 클래스에 대해 혼란스러운 점 [:blank:]
은바꾸다대괄호 표현식이므로 전체에는 두 개의 동심 대괄호 세트가 있습니다 [[:blank:]]
. 이는 또한 [[:blank:][:lower:]]
(단일 공백 또는 소문자) 또는 [-_[:alpha:]]
(대시, 밑줄 또는 문자) 와 같이 이를 결합하거나 [^[:blank:]]
(모든 문자) 와 같이 부정할 수 있음을 의미합니다.아니요공백).
따라서 다음과 같이 사용할 수 있습니다.
ptrn="[[:blank:]][[:blank:]]*"
echo "${str%$ptrn}"
그렇지 않으면:
echo "${str%[[:blank:]][[:blank:]]*}"