sed:替换所有出现的 _ 直到找到句点

sed:替换所有出现的 _ 直到找到句点

输入示例:

test_replace.test_json

预期输出:

test-replace

当前代码:

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

电流输出:

test-replace.test-json

任何援助将不胜感激!!

答案1

我会使用两个步骤:1)删除第一个点和后面的所有内容; 2)替换剩下的下划线

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

答案2

假设字符串保存在 shell 变量 中,name并假设您使用的是bashor zshshell:

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}的每个匹配项替换为 ) 是shell (以及至少shell)支持的扩展。patternreplacementbashzsh

相关内容