【问题标题】:Using awk to set first character to lowercase UNIX使用 awk 将第一个字符设置为小写 UNIX
【发布时间】:2020-09-24 16:00:32
【问题描述】:

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

脚本:

#!/bin/bash

foo="MyCamelCaseValue" 
awk '{s=tolower(substr($1,1,1))}{g=substr($1,2,length($1))}{print s,g}' <<<$foo

输出:

m yCamelCaseValue

编辑:

请参阅 Bobdylan 和 RavinderSingh13 对已接受答案的讨论,因为它突出了默认 MacOs bash 版本的问题。

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

【问题讨论】:

  • 使用{print s""g}
  • @RavinderSingh13 - 我在帖子被删除之前正在打字。无论如何-是的,我同意。但我更强调的是,是的,它在技术上是一种解决方案——但这不是最优雅的方式。他的尝试是一种尝试——但并不意味着它不能在批发时重写和改进。 :)
  • 使用 13 岁以上的版本有点问题,但我同意这个版本可能是个问题(不知道它是什么时候引入的)
  • 当然可以——我已经提交了一份回复作为替代方案,无论如何我们都同意。如果在 15 年前的版本(即 macos 默认)上并且您无法升级,那么一定要执行 awk 等。如果没有,请使用正确版本的 bash(您应该这样做)并以这种方式进行。现在离开这篇文章,因为我已经花了太长时间了;)
  • 我很乐意升级,问题是我正在创建这个脚本供我公司的其他 mac 用户使用。解决方案是打包,这样他们就不必担心版本,但我宁愿它使用他们设置的默认设置。听起来很愚蠢,对不起各位!感谢您的所有帮助:)

标签: awk


【解决方案1】:

你已经很接近了,很好的尝试,你不需要在这里得到行的长度,substr 足够聪明,可以让你提到一个字符位置的其余长度并且直到它应该打印的位置才给出(长度价值)。请您尝试关注一下。

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

echo "$foo" | awk '{print tolower(substr($0,1,1)) substr($0,2)}' Input_file

解释:

  • 使用awksubstr函数获取当前行的子字符串。
  • 然后抓住substr($0,1,1) 的第一个字母并将其包裹在tolower 中,使其成为小写字母。
  • 现在通过执行 `substr($0,2) 打印行的其余部分(因为第一个字符已经被前一个 substr 捕获),这将从第二个字符打印到最后一行。


@bob dylan 编辑:

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

MacOS 带有旧版本的 bash。但是,如果您 4 岁以上,您应该能够使用本机 bash 函数将第一个字符从大写转换为小写:

$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
 
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ cat foo.sh
#!/bin/bash
foo="MyCamelCaseValue"
echo "${foo,}"
$ bash foo.sh
myCamelCaseValue

整个字符串的更多示例,to lower, to upper 等

$ echo $foo
myCamelCaseValue
echo "${foo,}"
myCamelCaseValue
$ echo "${foo,,}"
mycamelcasevalue
$ echo "${foo^}"
MyCamelCaseValue
$ echo "${foo^^}"
MYCAMELCASEVALUE

【讨论】:

  • 工作得很好:) 我会在有能力的时候接受答案
  • 因为您基本上是在尝试从输入中进行管道传输并在长度方面做一些有趣的事情。只做"${foo,}" = 与说“tr 从上到下的第一个字符”相同,不需要 awk 和长度检查、乱码等。
  • 我的也是。您正在讨论文件范围等问题,但是他的示例为 $foo 提供了一个特定值,并且您做出了一个假设-我的观点是 ops 解决方案可能有效-但对于 bash 中的本机函数来说,这有点过分了
  • 如果我编辑原始问题并提及旧版本的 Bash 和 Mac 设置是否有益?编辑:我看到答案反映了此信息,我将保留未编辑的问题
  • All sorted :) 终于到了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
相关资源
最近更新 更多