1

文字列変数が$LIBRARIES="abc.so.1 def.so.1 hij.so.3.1"あり、すべての .so を次のように置き換えたい:

"abc.so* def.so* hij.so*" 

これどうやってするの?試しNEW_LIBRARIES=${LIBRARIES//.so*/.so$star}ましたが、うまくいきません。空白で終わるようにするにはどうすればよいですか?

4

2 に答える 2

1

またはより簡単

${LIBRARIES//.[0-9]/*}

拡張子が 2 つあるものは 2 ** になりますが、それで問題ありません

于 2012-11-28T18:02:00.870 に答える
0

これはそれを行う必要があります:

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 ...が、サブシェルを保存します。
于 2012-11-28T17:19:05.080 に答える