일부 텍스트가 뒤따르는 문자열에서 두 개 이상의 공백을 바꾸는 전역 패턴

일부 텍스트가 뒤따르는 문자열에서 두 개 이상의 공백을 바꾸는 전역 패턴

패턴 교체를 위해 두 개 이상의 공백과 텍스트 줄의 일부 텍스트가 일치하는 전역 패턴을 구성하고 싶습니다.

예를 들어 다음 문자열을 고려해보세요.

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:]]*}"

관련 정보