首页 > 解决方案 > 将文本从 HttpStatus.NOT_FOUND 转换为 bash 中的 status().isNotFound()

问题描述

我想将 bash 变量中的文本转换HttpStatus.NOT_FOUNDstatus().isNotFound(),我已经通过使用sed

result=HttpStatus.NOT_FOUND
result=$(echo $result | cut -d'.' -f2- | sed -r 's/(^|_)([A-Z])/\L\2/g' | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g')


echo "status().is$result()"

输出:

status().isNotFound()

正如你在这里看到的,我使用了 2 个sed命令。
有没有办法使用 1sed或任何其他更简单的方法来实现相同的结果?

标签: shellsed

解决方案


由于替换部分涉及大量新的文本插入,因此sed可以将命令详细编写如下。只需通过管道传递变量内容而不使用cut

result=HttpStatus.NOT_FOUND

echo "$result" |
sed -E 's/^.*(Status)\.([[:upper:]])([[:upper:]]+)_([[:upper:]])([[:upper:]]+)$/\L\1().is\u\2\L\3\u\4\L\5()/g'

sed这个想法是在捕获的组上添加 GNU 的大小写转换功能。所以我们捕捉

  • (Status)其中\1我们只是将整个字符串小写,然后将 a 添加().is到结果中
  • 下一个捕获的组\2将是后面的第一个大写字符.which would be和字符串的N其余部分。我们保留第二个,并做第三组的小写。OT\3
  • FOUND和中的下一个单词重复\4与上述相同的顺序\5
  • ,是 GNU 中可用的大小写转换运算\L符。\used

如果您只想修改.CamelCase 之外的部分,那么您可以使用sedas

result=HttpStatus.NOT_FOUND

result=$(echo "$result" |
sed -E 's/^.*\.([[:upper:]])([[:upper:]]+)_([[:upper:]])([[:upper:]]+)/\u\1\L\2\u\3\L\4/g')

echo "status().is$result()"

推荐阅读