一部のテキストが続く文字列で複数のスペースを置き換えるグローバルパターン

一部のテキストが続く文字列で複数のスペースを置き換えるグローバルパターン

パターンを置き換えるために、複数のスペースとテキスト行の一部のテキストが一致するグローバルパターンを構成したいと思います。

たとえば、次の文字列を考えてみましょう。

str="Here is a list of functions  Marionette Recutils"

2つ以上のスペースといくつかのテキストで構成される最後の部分を置き換えたいと思います。つまり、グローバルパターンマッチングで" Marionette Recutils"

複数のスペースといくつかのテキストが一致するパターンが必要です。次のパターンを思い出しました。

ptrn="[[:blank:]]+([[:blank:]])+([[:graph:]])"

パラメータ置換パターンが部分文字列と一致して、前と後の両方の文字を許可できますか?

ベストアンサー1

グローバルパターンを持つ2つ以上の項目には、次のものを使用できます。

  • {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

おすすめ記事