文字列変数が$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すべて置き換えるAB\.so[^ ]*/: で始まる任意のパターンに一致し.so、その[^ ]*部分は「0 個以上の非スペース文字が続く」ことを意味します\.so\*/: それを文字どおりに置き換えます.so*[、]、などの一部の記号は、正規表現で特別な意味を持つため、文字どおりに使用する場合は、プレフィックスを付けて「エスケープ」するだけです.。*\g: 最初だけでなく、すべてのオカレンスに対してこれを行います。<<< "$LIBRARIES":<<<表記法はherestringと呼ばれます: このコンテキストでは、 と同じことを実行しますecho "$LIBRARIES" | sed ...が、サブシェルを保存します。