我正在尝试创建一个将代词大写的 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”。
\b
sed 手册页中似乎没有提到,但它在GNU sed 手册:
\b
匹配单词边界;也就是说,如果左边的字符是“单词”字符而右边的字符是“非单词”字符,则匹配,反之亦然。
$ echo "abc %-= def." | sed 's/\b/X/g' XabcX %-= XdefX.
甚至手册也没有明确说明(但示例显示)\b
匹配行首和行末。它不匹配任何字符;它匹配出现在“单词”字符和“非单词”字符之间(无论顺序如何)或在行首和行末(如^
和 $
)的空字符串。所以我们不必担心捕获(使用\(
... \)
)它们匹配的字符,并用 和 替换它们\1
。\2
并且,由于\b
不匹配任何字符,此命令将继续工作i i
(将其更改为I I
)。