0

我编写了以下使用awk的bash脚本,目的是将第一个字符设置为小写。该脚本工作得很好,但是我在连接这两个值时添加了一个额外的空格。你知道如何删除这个错误的空间吗?

脚本:

#!/垃圾桶/垃圾桶foo=“MyCamelCaseValue”awk'{s=tollower(subster($1,1,1))}{g=substr($1,2,length($1)){prints,g}'

输出:

m yCamelCaseValue公司

编辑:

请参阅Bobdylan和RavinderSingh13关于公认答案的讨论,因为它突出了默认MacOs bash版本的问题。

bash—版本GNU bash,版本3.2.57(1)-版本(x86_64-apple-darwin19)版权所有(C)2007 Free Software Foundation,Inc。

15
  • 1
    使用{打印s“”g} 评论 2020年9月18日9:05
  • 2
    @RavinderSingh13-在帖子被删除之前,我正在打字。无论如何,是的,我同意。但我更倾向于原则,是的,这在技术上是一个解决方案,但这不是最优雅的方式。他的尝试是一种尝试,但并不意味着它不能被重写和大规模改进 评论 2020年9月18日9:30
  • 2
    公平地说,使用13年以上的版本有点问题。。。。。但我同意版本可能会有问题(不知道具体是什么时候介绍的) 评论 2020年9月18日9:35
  • 1
    当然可以,我已经提交了一份回复作为备选方案,无论如何我们都同意。如果在一个有15年历史的版本(即macos默认版本)上,你无法升级,那么无论如何都要执行awk等操作。如果没有,那么使用正确版本的bash(你应该这样做)并以这种方式进行。现在就离开这个帖子,因为我已经花了太长时间;) 评论 2020年9月18日9:37
  • 1
    我很乐意升级,问题是我正在创建这个脚本,供公司中的其他mac用户使用。解决方案是打包,这样他们就不必担心版本,但我宁愿使用他们设置的默认设置。听起来很蠢,对不起!感谢您的帮助:) 评论 2020年9月18日9:39

1答案1

重置为默认值
6

你很近很好的尝试了,你不需要在这里计算线的长度,子(substr)足够智能,可以获得您提到的字符位置的剩余长度,并且不要给出它应该打印的位置(长度值)。你能试试下面的吗。

(通常这类问题可以通过bash本身解决,但当OP尝试@bob dylan提供的bash解决方案时,由于bash的旧版本存在问题,因此我取消删除这一个为OP工作的解决方案)

echo“$foo”|awk'{print tolower(substr($0,1,1))substrs($0,2)}'输入文件

说明:

  • 使用子(substr)的功能awk公司获取当前行中的子字符串。
  • 然后抓住第一个字母子项(0,1,1美元)把它包在里面小写把它做成小盒子。
  • 现在通过执行`substr($0,2)打印行的其余部分(因为第一个字符已经被前一个子字符捕获),这将从第二个字符打印到行的最后一个。


编辑@bob dylan:

https://www.shell-tips.com/mac/upgrade-bash/

MacOS附带了旧版本的bash。但是,如果您使用的是4+,则应该能够使用本机bash函数将第一个字符从上到下转换:

$bash--版本GNU bash,版本4.4.19(1)-版本(x86_64-redhat-linux-GNU)版权所有(C)2016 Free Software Foundation,Inc。许可证GPLv3+:GNU GPL版本3或更高版本<http://gnu.org/licenses/gpl.html>这是自由软件;你可以自由地改变和重新分配它。在法律允许的范围内,无任何担保。$猫粮.sh#!/垃圾桶/垃圾桶foo=“MyCamelCaseValue”echo“${foo,}”$bash foo.sh(美元)我的骆驼案例价值

整个字符串的进一步示例,从下到上等等。

$echo$foo我的骆驼案例价值echo“${foo,}”我的骆驼案例价值$echo“${foo,,}”mycamecase值$echo“${foo^}”我的CamelCaseValue$echo“${foo^^}”MYCAMELCASE价值
8
  • 2
    做得很好:)我会接受答案 评论 2020年9月18日9:08
  • 因为您基本上是在尝试从输入进行管道传输,并在长度方面做一些大胆的操作。做的只是“${foo,}”=与说“从上到下tr第一个字符)一样,不需要awk和长度检查、乱码等。 评论 2020年9月18日9:21
  • 我的确实如此。您正在讨论文件范围等,但他的示例为$foo提供了一个特定的值,您做出了一个假设-我的观点是ops解决方案可能有效-但对于bash中的本机函数来说,这太过分了 评论 2020年9月18日9:26
  • 1
    如果我编辑最初的问题并提及Bash的旧版本和Mac设置,是否有益?编辑:我看到答案反映了这个信息,我将不编辑这个问题 评论 2020年9月18日9:43
  • 2
    全部排序:)最终到达那里! 评论 2020年9月18日9:44

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.