【问题标题】:How to transfer characters between uppercase and lowercase with sed如何使用sed在大写和小写之间传输字符
【发布时间】:2024-01-17 01:22:01
【问题描述】:

比如我的src.tex是

SectionType *p = NULL;

我想把它改成

section_type *p = NULL;

我想要做的只是改变SectionType,但保持NULL不变,我使用了y/[A-Z]/[a-z],但这会改变所有的行。

我的 sed 不支持 \L,\l,\U 和 \u 函数,它的版本是 3.* 并且在 FSF 下分发,而不是 GNU,可能 GNU 可以很好地处理这些函数,但当时我可以不采用 GNU,因为我在 msys 工作并且没有 GNU 包。

有什么办法可以得到吗?

【问题讨论】:

标签: sed uppercase lowercase


【解决方案1】:

来自here

将 CamelCase 或 camelCase 转换为 camel_case:

sed -e 's/\([A-Z][a-z]\)/_\l\1/g' -e 's/^_\([a-z]\)/\1/g' file.txt

输入:

SectionType *p = NULL;
sectionType *p = NULL;
ABCSectionType *p = NULL;

输出:

section_type *p = NULL;
section_type *p = NULL;
ABC_section_type *p = NULL;

【讨论】:

  • 嗯...这似乎践踏了NULL。寻找解决方案。编辑:固定。在第一个表达式上添加了[a-z],让它忽略所有大写的东西。
  • 我在 MSYS 中尝试过你的脚本,但我的 sed 仍然无法使用,因为你的脚本使用了 \l 来转换第一个字符,而我的 sed 不支持函数...
  • 我下载了一个 sed 的 GNU 发行版,将其命名为“gsed”,并将其放在 MSYS/bin 下,它与您的脚本配合得很好,我们可以使用 -i 覆盖我们要传输的文件,在命令行下节省大量按键。 :) 无论如何,我们应该测试每个版本的 sed 以使我们的脚本大部分时间都运行。感谢您的意见。 :)
  • 不客气。我很高兴它对你有用。当您在 * 上找到问题的正确答案时,您应该将答案标记为已接受答案(单击答案旁边的复选框)。
【解决方案2】:

无需安装另一个版本的sed 即可使用。它仅在该行的第一个单词上改变大小写。

upper=$(printf "%s" {A..Z})
lower=$(printf "%s" {a..z})
sed "s/ /\n/;h;s/[^\n]*\n//;x;s/\n.*//;y/$upper/$lower/;G;s/\n//" inputfile

我的sed 版本不会y/[A-Z]/[a-z]/,它需要明确包含每个字符,这就是我使用变量的原因。我创建它们的方式取决于只有某些 shell(例如 Bash 和 ksh)具有的功能。如果您的sed 支持,您可以进行简单的分配或使用范围。

如果您的sed 版本真的很挑剔,它可能需要-e 而不是分号。这个版本应该在这种情况下工作:

sed -e "s/ /\n/" -e "h" -e "s/[^\n]*\n//" -e "x" -e "s/\n.*//" -e "y/$upper/$lower/" -e "G" -e "s/\n//" inputfile

【讨论】:

  • 目前对sed的这些高级特性一窍不通,只学了3天,刚学了一些sed中用到的正则表达式和替换语法……不过你的代码看起来很棒,我真的正如您所说,在我的 sed 中对其进行测试,运行良好,并且...在没有 ctrl + c/v.. 的情况下很难输入这么多字符 :)
最近更新 更多