假设我们有一个包含以下条目的文本文件。
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/^/#/
这使用v
in 来g
在每一行上应用相同的替换不是匹配表达式^[[:blank:]]*$
,即为空或仅包含空格。该v
命令也是从ed
编辑器继承的。
您是否还想避免添加#
到已经以 开头的行#
,然后将上述命令中的替换更改为s/^#\?/#/
。这会#
在非空行上插入 a,但是代替a#
开头(如果有的话)。
答案3
你也可以这样做:
:%norm I#
对于每一行,%
应用norm
al 模式命令I
在行的开头插入(忽略前导空格)并输入字符#
。
这种方法的好处是您可以应用任何正常模式命令序列 - 从这个意义上来说它们有点像宏(通过使用:g/pattern/norm I#
您可以将它们应用于匹配的行pattern
)。