sed:ピリオドが見つかるまで_のすべての項目を置き換えます。

sed:ピリオドが見つかるまで_のすべての項目を置き換えます。

入力例:

test_replace.test_json

予想出力:

test-replace

現在のコード:

sed -e 's/_/-/g'

現在の出力:

test-replace.test-json

どんな助けでも大変感謝します! !

答え1

私は2つのステップを使います:1)最初の点とその後のすべての点を削除します。 2) 残りの下線を置き換えます。

sed 's/\..*//; s/_/-/g'

答え2

文字列がシェル変数にあると仮定するか、シェルをname使用しているとします。bashzsh

name=${name%.*}    # remove everything after the last dot
name=${name//_/-}  # change all underscores to dashes

上記の最初の割り当てで削除された拡張を維持しますか?

ext=${name##*.}    # remove everything up to the last dot
name=${name%.*}    # remove everything after the last dot
name=${name//_/-}  # change all underscores to dashes
name=$name.$ext    # re-attach extension

または、別の順序でタスクを実行して時間を少し短くしてください。

ext=${name##*.}        # remove everything up to the last dot
name=${name//_/-}      # change all underscores to dashes
name=${name%.*}.$ext   # remove (possibly modified) extension and attach original extension

${variable%pattern}(最も短い一致の接尾辞の削除) と${variable##pattern}(最も長い一致の接頭辞の削除)の両方が標準変数拡張です. (${variable//pattern/replacement}すべての発生を)シェル(および少なくともシェル)がサポートする拡張に置き換えます。patternreplacementbashzsh

関連情報