V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wuxi889
V2EX  ›  Linux

求助 在 Linux shell 里的替换问题

  •  
  •   wuxi889 · 2021-01-28 16:52:30 +08:00 · 2320 次点击
    这是一个创建于 1424 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有个需要需要将例如 AdadaBdaC 参数值替换成 adada-bda-c 这种骚操作怎么处理,大写包括 A-Z

    23 条回复    2021-01-29 11:07:18 +08:00
    ysc3839
        1
    ysc3839  
       2021-01-28 16:58:30 +08:00 via Android
    我只知道 Python 有个 inflection 库可以实现
    https://inflection.readthedocs.io/en/latest/#inflection.parameterize
    xupefei
        2
    xupefei  
       2021-01-28 17:02:24 +08:00 via iPhone
    用正则表达式把大写字母替换成 -小写字母,然后 trim 掉-
    lululau
        3
    lululau  
       2021-01-28 17:05:17 +08:00
    echo AdadaBdaC | ruby -ne 'puts $_.scan(/[A-Z][a-z]*/).map(&:downcase)*"-"'
    jdhao
        4
    jdhao  
       2021-01-28 17:07:07 +08:00 via Android
    正则替换?
    wuxi889
        5
    wuxi889  
    OP
       2021-01-28 17:07:08 +08:00
    @lululau 容器里跑只能用基本命令,大佬你这条用不上了
    wuxi889
        6
    wuxi889  
    OP
       2021-01-28 17:09:22 +08:00
    @jdhao @xupefei 原谅我做一次伸手党 [手动捂脸]
    bootvue
        7
    bootvue  
       2021-01-28 17:11:18 +08:00
    干掉这个需求
    RudyS
        8
    RudyS  
       2021-01-28 17:17:53 +08:00
    sed -i 's/A/a/g' file
    sed -i 's/B/-b/g' file
    sed -i 's/C/-c/g' file
    aheadlead
        9
    aheadlead  
       2021-01-28 17:18:10 +08:00
    shell 真是一言难尽… 给楼主一个方案吧。。。

    a=$(echo "AdadaBdaC" | sed -e 's/\([A-Z]\)/-\L\1/g')
    echo ${a#-}
    aheadlead
        10
    aheadlead  
       2021-01-28 17:19:36 +08:00
    @xupefei #2 就是 2L 的方案
    zeroDev
        11
    zeroDev  
       2021-01-28 17:20:22 +08:00 via Android
    用 sed,如果要换的多,建议写个脚本文件
    maichael
        12
    maichael  
       2021-01-28 17:24:11 +08:00
    echo AdadaBdaC | sed -E 's/([A-Z])/_\1/g' | sed -E 's/^_//g' | tr 'A-Z' 'a-z'
    maichael
        13
    maichael  
       2021-01-28 17:24:48 +08:00
    @maichael #12 echo AdadaBdaC | sed -E 's/([A-Z])/-\1/g' | sed -E 's/^-//g' | tr 'A-Z' 'a-z'
    zpfhbyx
        14
    zpfhbyx  
       2021-01-28 17:30:24 +08:00
    echo 'AdadaBdaC' | sed 's/[A-Z][a-z]*/\L&-/g' | sed 's/.$//' centos 下可以,mac 下不行
    wuxi889
        15
    wuxi889  
    OP
       2021-01-28 17:40:09 +08:00
    @aheadlead @maichael @zpfhbyx 大佬们在上,受小弟一拜,提前百年。我去试试
    libook
        16
    libook  
       2021-01-28 17:41:36 +08:00
    @zpfhbyx Linux 下的 sed 是 GNU sed,MacOS 下的 sed 是 BSD sed,不光 sed,很多指令两者都有区别。
    你要想在 MacOS 下用 GNU 指令就要装 Coreutils,你可以去网上搜如何用 brew 装,以及如何设为默认指令。
    zpfhbyx
        17
    zpfhbyx  
       2021-01-28 17:43:20 +08:00
    @libook 感谢,我去搜搜,一般都是 linux 下写 shell - - 没细看过
    aheadlead
        18
    aheadlead  
       2021-01-28 17:50:15 +08:00 via iPhone
    @zpfhbyx brew install gsed
    zlowly
        19
    zlowly  
       2021-01-28 17:50:19 +08:00   ❤️ 1
    stackoverflow 上有 How to convert a string to lower case in Bash?比较全。抄几条
    POSIX standard
    echo "AdadaBdaC" | tr '[:upper:]' '[:lower:]'
    AWK
    echo "AdadaBdaC" | awk '{print tolower($0)}'
    atomduanvex
        20
    atomduanvex  
       2021-01-28 18:16:22 +08:00
    echo AdadaBdaC | sed -E 's/([A-Z])/-\1/g' | sed 's/^-//g' | tr [A-Z] [a-z]
    ideno
        21
    ideno  
       2021-01-28 19:29:20 +08:00
    echo 'AdadaBdaC' | awk '{first=tolower(substr($0, 1, 5)); second=tolower(substr($0, 6, 3)); third=tolower(substr($0, 9)); printf("%s-%s-%s", first, second, third);}'
    ideno
        22
    ideno  
       2021-01-28 19:31:06 +08:00
    echo 'AdadaBdaC' | awk '{str=tolower($0);printf("%s-%s-%s", substr(str, 1, 5), substr(str, 6, 3), substr(str, 9));}'
    wuxi889
        23
    wuxi889  
    OP
       2021-01-29 11:07:18 +08:00
    @zlowly @atomduanvex @ideno 感谢感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5433 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 90ms · UTC 07:19 · PVG 15:19 · LAX 23:19 · JFK 02:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.