文字列変数が$LIBRARIES="abc.so.1 def.so.1 hij.so.3.1"
あり、すべての .so を次のように置き換えたい:
"abc.so* def.so* hij.so*"
これどうやってするの?試しNEW_LIBRARIES=${LIBRARIES//.so*/.so$star}
ましたが、うまくいきません。空白で終わるようにするにはどうすればよいですか?
またはより簡単
${LIBRARIES//.[0-9]/*}
拡張子が 2 つあるものは 2 ** になりますが、それで問題ありません
これはそれを行う必要があります:
LIBRARIES="abc.so.1 def.so.1 hij.so.3.1"
NEW_ALL_LIBRARIES=$(sed 's/\.so[^ ]*/\.so\*/g' <<< "$LIBRARIES")
echo "$NEW_ALL_LIBRARIES"
出力:
abc.so* def.so* hij.so*
説明:
LIBRARIES="..."
: 変数に文字列を代入する場合、変数にはプレフィックスが付きません$
NEW_ALL_LIBRARIES=$(...)
: この$(...)
表記はコマンド置換と呼ばれます。基本的に、新しいサブシェルを生成して、含まれているコマンドを実行し、出力をこの新しいサブシェルに返しますstdout
(ここでは に保存しますNEW_ALL_LIBRARIES
)。sed
:ストリーミング エディター ツールであるsedを呼び出します。's/\.so[^ ]*/\.so\*/g'
:正規表現 (regex)を使用してパターンを照合し、置換します。この構文をもう少し分解してみましょう。
s/
"代わりの"; 例:の出現箇所をs/A/B/g
すべて置き換えるA
B
\.so[^ ]*/
: で始まる任意のパターンに一致し.so
、その[^ ]*
部分は「0 個以上の非スペース文字が続く」ことを意味します\.so\*/
: それを文字どおりに置き換えます.so*
[
、]
、などの一部の記号は、正規表現で特別な意味を持つため、文字どおりに使用する場合は、プレフィックスを付けて「エスケープ」するだけです.
。*
\
g
: 最初だけでなく、すべてのオカレンスに対してこれを行います。<<< "$LIBRARIES"
:<<<
表記法はherestringと呼ばれます: このコンテキストでは、 と同じことを実行しますecho "$LIBRARIES" | sed ...
が、サブシェルを保存します。