変数の部分文字列を置き換える方法は?

変数の部分文字列を置き換える方法は?

文字列変数から文字を削除しようとしています。sed私にとっては次のようになります。

MYVAR=--23ho02123ware38384you443d34o3434ingtod38384day-%§*#sfrf
echo ${MYVAR} | sed -e 's/[a-z][a-z0-9\-]*//g'

私は得る:

 --23%§*#

これが私が探しているものです。文字列は文字で始まり、文字、数字、ダッシュ(-)のみを含める必要があります。bash文字列を置き換えることでこれを達成する方法はありますか?

MYVAR=${MYVAR/[a-z][a-z0-9-]*/ }

いくつかの組み合わせを試しましたが、それらのどれも期待どおりに機能しませんでした。

答え1

同等の正規表現を取得するには、 ksh 拡張 glob 演算子 ( bashwithshopt -s extglobおよび with でzsh使用できるサブセット) を使用する必要があります (ただし、他の構文を使用してもその項目はここで)。set -o kshglob*(x)x*

shopt -s extglob # for bash
# set -o kshglob # for zsh
printf '%s\n' "${MYVAR//[[:alpha:]]*([[:alnum:]-])/}"

またはzsh extendedglobsを使用してください。ここで正規表現と同等のものは次のとおり*です#

set -o extendedglob
printf '%s\n' ${MYVAR//[[:alpha:]][[:alnum:]-]#}

いくつかの注意:

  • ${var/pattern/replacement}最初の発生のみが置き換えられます。すべての項目を置き換えるために使用されます(コマンドの${var//pattern/replacement}'フラグと同様に)。gseds
  • 代替文字を空白に設定しました。${var//pattern/}(または)を使用して${var//pattern}空の文字列に置き換えます。
  • echo任意の文字列を出力するために使用したくありません。
  • を除いてzshリストコンテキストの変数拡張を引用する必要があります。
  • sed変数に改行文字が含まれている場合、動作はメソッドとは異なります。
  • [a-z]aと(一部のツールの要素の組み合わせ)で構成される文字と一致しますz。このリストはロケール、システム、およびツールによって異なります(たとえば、GNUシステムのロケールは、、、[a-z]と一致しますが一致しません)。通常、英語のアルファベットの小文字26文字が含まれていますが、必ずしもそうではありません。検討中の文字(または組み合わせ要素)を含みます。bash-4.3en_GB.UTF-8AXéZ[[:alpha:]]アルファベット順に(大文字と小文字に関係なく)あなたのロケールから。英語の26文字のみを一致させるには、またはを使用して[abcdefghijklmnopqrstuvwxyz]ロケールをCLC_ALL=C)で固定し、英語の小文字にのみorを[a-z]使用するか、すべての英字に/を使用します。[[:lower:]][a-zA-Z][[:alpha:]]
  • [a-z0-9\-]in はsedバックスラッシュ文字と一致します。[a-z0-9-]代わりに使用してください(-文字通り使用するには、最初または最後でなければなりません)。

関連情報