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)
“^”(或其他特殊字符,如果方便的话)之前的任何内容都将大写
此外,如果删除“^”更容易,也不需要删除。
使用 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: 将内容重定向inputfile到stdin-r: 允许使用扩展的正则表达式> out: 将内容重定向stdout到out命令 #2 分解:
< inputfile: 将内容重定向inputfile到stdin> out: 将内容重定向stdout到out正则表达式细分:
s: 执行替换/: 启动正则表达式^: 匹配行的开头(: 开始第一个捕获组.*: 匹配任意数量的字符): 停止第一个捕获组\^: 匹配一个^字符/:停止正则表达式/开始替换\U: 开始转换为大写\1: 替换为第一个捕获组\E: 停止转换为大写/: 停止更换使用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)