如果任何首排英文字母是小写,则将其大写

-1 sed text-processing posix regular-expression tr

我有一个 Markdown 文档,myfile.md其中包含一个英文句子列表,其中一些首字母小写,一些大写。
所有英文句子都以标准英文字母开头;没有使用特殊字符:

×
×
×

我需要这个逻辑的函数:
如果任何首排英文字母是小写,则将其大写

因此,要将文件更改为如下所示:

X
X
X


我试过的

1) tr

我想尝试tr使用正则表达式来这样做,基于'tr '[:lower:]' '[:upper:]' myfile.md 但我既没有找到将正则表达式结合trtr.
相反,我只找到了一种在 shell 提示中转换文本的方法,如下所示:

echo x | tr '[:lower:]' '[:upper:]'
Run Code Online (Sandbox Code Playgroud)

X

2) 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

使用\UGNU sed 中的函数。

 s/^\([a-z]\)/\U\1/
Run Code Online (Sandbox Code Playgroud)

所以如果它是小写的,那么这会在行的开头捕获一个字符,如果是大写的话。

由于 \U 不考虑其他事情,这可以简化为

s/\(.\)/\U\1/
Run Code Online (Sandbox Code Playgroud)

因为.将匹配该行的第一个字符(如果有)。

  • 或者只是`s/^[az]/\U&/`。请注意,除非您在 C 语言环境中,否则 `[az]` 可能包含比 _English_ 字母更多的字母(甚至非字母和字符序列)。诸如`æ`、`ß`、`℉`、``... (4认同)

Kus*_*nda 5

tr在这里不会帮助你,因为大写 withtr会把所有字符变成大写(tr只有一个字符一次上下文,所以它永远不会知道“行的开头”或“单词的开头” ”)。

sed如果你使用 GNU 就可以做到sed。但是,您显示的方式将用文字文本替换第一个大写字符[A-Z]


由于这个问题被标记为,因此这是一个符合标准的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:]]为 来替换该行中的第一个非空白字符(这将保留任何缩进)。