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