-1 sed text-processing posix regular-expression tr
我有一个 Markdown 文档,myfile.md
其中包含一个英文句子列表,其中一些首字母小写,一些大写。
所有英文句子都以标准英文字母开头;没有使用特殊字符:
×
×
×
我需要这个逻辑的函数:
如果任何首排英文字母是小写,则将其大写
因此,要将文件更改为如下所示:
X
X
X
tr
我想尝试tr
使用正则表达式来这样做,基于'tr '[:lower:]' '[:upper:]' myfile.md
但我既没有找到将正则表达式结合tr
到tr
.
相反,我只找到了一种在 shell 提示中转换文本的方法,如下所示:
echo x | tr '[:lower:]' '[:upper:]'
Run Code Online (Sandbox Code Playgroud)
X
sed
sed 's/^[a-z]*/[A-Z]/' myfile.md
sed -r 's/^[a-z]*/[A-Z]/' myfile.md
Run Code Online (Sandbox Code Playgroud)
但是在执行之后,myfile.md
仍然包含
×
×
×
反而:
X
X
X
如何在不使用任何 CLUI 文本编辑器(例如nano
或 )的情况下使用 shell 中描述的逻辑vim
?
ica*_*rus 10
使用\U
GNU sed 中的函数。
s/^\([a-z]\)/\U\1/
Run Code Online (Sandbox Code Playgroud)
所以如果它是小写的,那么这会在行的开头捕获一个字符,如果是大写的话。
由于 \U 不考虑其他事情,这可以简化为
s/\(.\)/\U\1/
Run Code Online (Sandbox Code Playgroud)
因为.
将匹配该行的第一个字符(如果有)。
tr
在这里不会帮助你,因为大写 withtr
会把所有字符变成大写(tr
只有一个字符一次上下文,所以它永远不会知道“行的开头”或“单词的开头” ”)。
sed
如果你使用 GNU 就可以做到sed
。但是,您显示的方式将用文字文本替换第一个大写字符[A-Z]
。
由于这个问题被标记为posix,因此这是一个符合标准的awk
解决方案,它将简单地将任何行上的第一个字符大写:
awk '{ ch = toupper(substr($0,1,1)); sub(".", ""); $0 = ch $0; print }' file
Run Code Online (Sandbox Code Playgroud)
该awk
命令正在执行的操作是使用 提取该行的第一个字符substr()
。然后将其大写并将其分配给变量ch
。然后使用删除该行上的第一个字符,sub()
并将大写字母ch
添加到该行前面。然后打印该行。
测试这个:
awk '{ ch = toupper(substr($0,1,1)); sub(".", ""); $0 = ch $0; print }' file
Run Code Online (Sandbox Code Playgroud)
$ cat file
Apple
orange
grapefruit
Mango
Run Code Online (Sandbox Code Playgroud)
如果数据有一些缩进(即行开头有空格),则改用
awk '{ ch = toupper(substr($1,1,1)); sub(".", "", $1); $1 = ch $1; print }' file
Run Code Online (Sandbox Code Playgroud)
(但这会消除缩进)。
如果您愿意使用 Perl 来执行此操作,则以下代码会将每行的第一个字符大写,其方式与awk
上面第一个程序的执行方式类似。
perl -pe 'substr($_,0,1,uc(substr($_,0,1)))' file
Run Code Online (Sandbox Code Playgroud)
虽然使用
perl -pe 's/^./\U$&/' file
Run Code Online (Sandbox Code Playgroud)
会更短并且更“像 Perl”。
^.
在该表达式中替换[^[:blank:]]
为 来替换该行中的第一个非空白字符(这将保留任何缩进)。