Washington George
Adams John
Jefferson Thomas
Madison James
预期的:
W. George
A. John
J. Thomas
M. James
我尝试过使用sed
.以下是我在多次谷歌搜索后使用的一些模式。
\< # match start of word
\> # match end of word
's/[^a-z]././'
's/.....\>/./'
我很难捕捉到第一次出现后的字母直到下一个单词。
答案1
您可以使用此sed
命令:
$ sed 's/^\(.\)[^ ]*/\1./' file
W. George
A. John
J. Thomas
M. James
或者更简洁地说:
$ sed -E 's/^(.)[^ ]*/\1./' file
W. George
A. John
J. Thomas
M. James
它能做什么:
- 捕获第一个字符
^(.)
。 - 然后选择下一个不是空格的字符
[^ ]*
。 - 用捕获的字符和点替换以前的模式。
代表\1
第一个捕获组:(.)
。您可以进行多次捕获,每个捕获都将由一个增量数字表示:\1
第一次捕获、\2
第二次捕获,依此类推。捕获是通过用括号包围模式来执行的,而不用-E
反斜杠转义标志。
答案2
看起来您想用点替换第一组小写字母。
您可以通过使用基本正则表达式匹配仅包含小写字母的第一个子字符串来完成此操作。
$ sed 's/[[:lower:]]\{1,\}/./' file
W. George
A. John
J. Thomas
M. James
此外,sed
如果与该选项一起使用,大多数实现都支持扩展正则表达式-E
。
$ sed -E 's/[[:lower:]]+/./' file
W. George
A. John
J. Thomas
M. James
这样做假设您要缩写的名称全部以大写字母开头。幸运的是,这种情况很常见。
答案3
使用 Raku(以前称为 Perl_6)
perl6 -pe 's/^^ (\w+) /{$0.comb[0]}./;'
输入示例:
Washington George
Adams John
Jefferson Thomas
Madison James
示例输出:
W. George
A. John
J. Thomas
M. James
简而言之,我们使用 Raku 的s///
替换运算符,要求从^^
行首开始匹配,将第一个\w+
单词捕获到捕获变量(…)
中$0
。在替换中,指示 Raku 执行{…}
大括号内的代码,此处将捕获变量comb
-ing$0
为单个字母,然后取[0]
第一个字母,最后打印一个文字.
句点。
你可以(当然)简单地捕获一个字母,要求它是大写的:
raku -pe 's/^^ (<upper>) \w* /$0./;'
第二个示例代码(上面)给出了与 OP 的示例输入相同的输出,但也具有保留(非大写)名称(如“de”)不变的优点de Gaulle Charles
。
https://docs.raku.org/syntax/s$SOLIDUS$SOLIDUS$SOLIDUS
https://raku.org