【问题标题】:Awk/Sed how to change a camel url path to a underscore path?awk/sed 如何将骆驼 url 路径更改为下划线路径?
【发布时间】:2020-12-21 02:08:03
【问题描述】:

我有以下文字:

SendNoticeMsg (api.post = "/test/SendNoticeMsg")

我想将文本更改为:

SendNoticeMsg (api.post = "/test/send_notice_msg")

我尝试使用这个 sed 脚本:

sed -E 's/(\/test\/.*)([A-Z]).*\"/\1\2_\L/'

但它不起作用。

【问题讨论】:

  • 我不想将所有驼峰式改为下划线。所以这个答案在这种情况下似乎不起作用
  • 您应该扩展您的示例输入/输出以包含不仅仅是一个简单的晴天案例,例如包括具有多个连续大写字母的大小写以及您认为处理起来可能不明显/微不足道的任何其他内容。

标签: linux awk sed


【解决方案1】:

如果您无法访问 Aleksey 发布的链接,那么这里可以为您提供帮助:

echo /test/SendNoticeMsg | sed -E 's|/test/([A-Z])([a-z]+)([A-Z])([a-z]+)([A-Z])([a-z]+)|/test/\L\1\2_\L\3\4_\L\5\6|g'

【讨论】:

  • [a-z][A-Z] 表示不同语言环境中的不同字符集(例如,[a-z] 可能表示 aAbBcC...z[A-Z] 在该语言环境中表示 AbBcC...zZ),您应该使用用于可移植性的 POSIX [[:lower:]][[:upper:]] 字符类。请注意,虽然该解决方案适用于发布的一个示例,但它通常不起作用,例如如果输入有 2 个或 4 个大写字母而不是 3 个。
【解决方案2】:

试试这个。

$ cat underscore.txt
SendNoticeMsg (api.post = "/test/SendNoticeMsg")
$ perl -pe ' s/(?:\/test\/)(\S+)/$s=$1;$s=~s!([A-Z])!$i++?"_".lc($1):lc($1)!ge;"\/test\/".$s/mge ' underscore.txt
SendNoticeMsg (api.post = "/test/send_notice_msg")
$

【讨论】:

    【解决方案3】:

    使用 GNU awk 将第三个参数匹配():

    awk 'match($0,"(.*/test/)(.)(.*)",a){ gsub(/[[:upper:]]/,"_&",a[3]); $0=a[1] tolower(a[2] a[3]) } 1' file
    SendNoticeMsg (api.post = "/test/send_notice_msg")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      相关资源
      最近更新 更多