如何在某个字符之前将字母大写?(^)

Tux*_*ife 5 command-line text-processing

我想转换这个:

foo^bar
ba^rfoo
oofrab
raboof^
Run Code Online (Sandbox Code Playgroud)

对此:

FOObar
BArfoo
oofrab
RABOOF
Run Code Online (Sandbox Code Playgroud)

“^”(或其他特殊字符,如果方便的话)之前的任何内容都将大写

此外,如果删除“^”更容易,也不需要删除。

kos*_*kos 8

使用 GNU sed(Ubuntu 的默认设置)(感谢 pabouk 的-r选项建议):

< inputfile sed -r 's/^(.*)\^/\U\1\E/' > out
Run Code Online (Sandbox Code Playgroud)

使用perl(感谢 Oli 缩短了正则表达式):

< inputfile perl -pe 's/^(.*)\^/\U\1\E/' > out
Run Code Online (Sandbox Code Playgroud)

命令 #1 分解

  • < inputfile: 将内容重定向inputfilestdin
  • -r: 允许使用扩展的正则表达式
  • > out: 将内容重定向stdoutout

命令 #2 分解

  • < inputfile: 将内容重定向inputfilestdin
  • > out: 将内容重定向stdoutout

正则表达式细分

  • s: 执行替换
  • /: 启动正则表达式
  • ^: 匹配行的开头
  • (: 开始第一个捕获组
  • .*: 匹配任意数量的字符
  • ): 停止第一个捕获组
  • \^: 匹配一个^字符
  • /:停止正则表达式/开始替换
  • \U: 开始转换为大写
  • \1: 替换为第一个捕获组
  • \E: 停止转换为大写
  • /: 停止更换

  • 第二个命令缺少一个命令!我想你忘记了`perl`。另外,您不需要用第二个捕获替换第二个捕获。只是不要捕捉它。`s/^(.*)\^/\U\1/` 将完成这项工作。 (2认同)
  • 什么非 GNU sed 版本支持 `\U`? (2认同)

mur*_*uru 5

使用vim

vim -es '+g/\^/normal gUf^' +wq foo
Run Code Online (Sandbox Code Playgroud)
  • -es这个古老的ex模式转弯,和沉默vim的(大部分)。
  • + 用于提供 vim 命令作为命令行参数。
  • g/\^/ - 在所有匹配的行上运行命令 /\^/
  • normal - 作为正常模式操作运行命令的其余部分。
  • gUf^- 转换为大写 ( gU) 直到^( f^)。g/.../在这种情况下使用范围时),在执行命令之前将光标放置在每行的开头。
  • 然后保存并退出 ( wq)。

f查找第一个^,因此具有多个的^行将仅转换字段。没有找到最后一个的简单动作^。您可以尝试转到行尾并向后搜索 ( $F^),但如果^是最后一个字符,则会失败。因此,您需要分两步完成:

vim -es '+g/\^./norm $F^gU0' '+g/\^$/norm gU$' +wq foo
Run Code Online (Sandbox Code Playgroud)