将文本文件中的“I”大写的 Sed 脚本

nic*_*b96 2 text-editing regex sed command-line

我正在尝试创建一个 sed 命令,该命令将文本文件中的代词I大写。例如“我喜欢狗”。应该是“我喜欢狗”。 到目前为止,我有:

sed 's/ i / I /g'
Run Code Online (Sandbox Code Playgroud)

这在许多不同的场景中都不起作用。就像i周围有标点符号一样。

这是我认为该命令应该能够处理的场景列表:

  • 一行文本中有多个 ' i。我认为这可以通过g在最后放置标志来解决。
  • ' i ' 周围有标点符号。例如,在它之后的逗号或句号,或者它之前或之后的引号或括号。
  • ' i ' 是该行的第一个或最后一个字符。这意味着您不能只检查它周围的空格或标点符号。
  • 一个单词中的任何常规 ' i都被保留下来。例如“FREFghter”不应被变成“FREFghter”。

小智 5

假设您使用的是 GNU sed,一种方法是

sed 's/\([[:space:]]\|[[:punct:]]\)i\([[:space:]]\|[[:punct:]]\)/\1I\2/g'
Run Code Online (Sandbox Code Playgroud)

或类似的东西。这仍然保留了以“我喜欢狗”开头的行的情况,因为代词之前没有空格。解决此问题的一种方法是

sed 's/\(^\|[[:space:]]\|[[:punct:]]\)i\([[:space:]]\|[[:punct:]]\)/\1I\2/g'
Run Code Online (Sandbox Code Playgroud)

当你在“ii”中有连续的“i”时,这种情况仍然存在,但我想不出为什么会在英文文本中出现这种情况,除非当正确的短语是“aye”时错误地写了“ii sir”好的,先生'。

如果您还使用小写罗马数字,也会有粗糙的边缘。sed 脚本无法判断 'i' 是代词还是罗马数字,但确实没有好的解决方案。