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

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

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

sed 's/ i / I /g'

这在很多情况下都行不通。比如如果

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

  • 有多个''s 在一行文本上。我认为只需g在末尾添加标志即可解决这个问题。
  • 这 '' 周围有标点符号。例如,后面有逗号或句号,前面或后面有引号或括号。
  • 这 '' 是行中的第一个或最后一个字符。这意味着您不能只检查其周围的空格或标点符号。
  • 任何常规的单词中的 ' 不加修饰。例如“f參考ghter”不应该变成“f參考战斗机”。

答案1

假设你正在使用 GNU sed,一种方法是

sed 's/\([[:space:]]\|[[:punct:]]\)i\([[:space:]]\|[[:punct:]]\)/\1I\2/g'

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

sed 's/\(^\|[[:space:]]\|[[:punct:]]\)i\([[:space:]]\|[[:punct:]]\)/\1I\2/g'

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

如果您还使用小写罗马数字,那么也会有麻烦。sed 脚本无法判断“i”是代词还是罗马数字,但对此确实没有好的解决方案。

答案2

一个简单的解决方案(使用 GNU sed):

sed 's/\bi\b/I/g'

这基本上与其他答案的概念相同 - 当“i”不是较大单词的一部分时,用“I”替换“i”。  \bsed 手册页中似乎没有提到,但它在GNU sed 手册

\b

    匹配单词边界;也就是说,如果左边的字符是“单词”字符而右边的字符是“非单词”字符,则匹配,反之亦然。

      $ echo "abc %-= def." | sed 's/\b/X/g'
      XabcX %-= XdefX.
      

甚至手册也没有明确说明(但示例显示)\b匹配行首和行末。它不匹配任何字符;它匹配出现在“单词”字符和“非单词”字符之间(无论顺序如何)或在行首和行末(如^和 $)的空字符串。所以我们不必担心捕获(使用\(... \))它们匹配的字符,并用 和 替换它们\1\2并且,由于\b不匹配任何字符,此命令将继续工作i i(将其更改为I I)。

相关内容