如何使用 vi 在文本文件中每行的开头添加特定字符

如何使用 vi 在文本文件中每行的开头添加特定字符

假设我们有一个包含以下条目的文本文件。

my name is XYZ

I study at ABC school

如果使用 vi 模式我想在每行前面添加“#” :%s/^/#/g问题是“#”也会插入到文本文件的空行中,但我只想在非空行前面添加“#”。

答案1

尝试

:%s/^./#&/

在哪里

  • :命令模式
  • %所有线路
  • s/LHS/RHS/将左侧替换为右侧
  • ^开始如果行
  • .一个字符
  • #
  • &我们发现了什么

答案2

我假设您希望避免#在“空白”行的开头添加,即可能为空或仅包含空格或制表符的行。

#在包含非空白字符的每一行的开头插入:

:g/[^[:blank:]]/ s/^/#/

这使用g从编辑器继承的(“全局”)命令ed在与正则表达式匹配的每一行上应用替换[^[:blank:]]。此表达式匹配至少包含一个非空白字符的行。 “空白字符”(在 POSIX 语言环境中)是制表符或空格。

具有相同效果的命令:

:v/^[[:blank:]]*$/ s/^/#/

这使用vin 来g在每一行上应用相同的替换不是匹配表达式^[[:blank:]]*$,即为空或仅包含空格。该v命令也是从ed编辑器继承的。

您是否还想避免添加#到已经以 开头的行#,然后将上述命令中的替换更改为s/^#\?/#/。这会#在非空行上插入 a,但是代替a#开头(如果有的话)。

答案3

你也可以这样做:

:%norm I#

对于每一行,%应用normal 模式命令I在行的开头插入(忽略前导空格)并输入字符#

这种方法的好处是您可以应用任何正常模式命令序列 - 从这个意义上来说它们有点像宏(通过使用:g/pattern/norm I#您可以将它们应用于匹配的行pattern)。

相关内容