使用命令行注释/取消注释某些行的最简单方法


37

有没有一种方法可以使用命令行注释/取消注释shell / config / ruby​​脚本?

例如:

$ comment 14-18 bla.conf
$ uncomment 14-18 bla.conf

这将添加或删除#的标志bla.conf线1418。通常我使用sed,但是我必须知道这些行的内容,然后执行查找替换操作,并且当一根以上的针头时,这将产生错误的结果(而我们只想替换第N个针一)。


1
有一个A到这个问答标题:代码取消注释多行,由行号的规定,使用vi或VIM其示出了用于执行此操作使用许多方法sedperl通过terdon等。具体的甲!
slm

Answers:


46

要注释bla.conf的第2至4行:

sed -i '2,4 s/^/#/' bla.conf

要制作所需的命令,只需将以上内容放入名为注释的shell脚本中:

#!/bin/sh
sed -i "$1"' s/^/#/' "$2"

该脚本的用法与您的脚本相同,不同之处在于第一行和最后几行用逗号而不是破折号隔开。例如:

comment 2,4 bla.conf

可以类似地创建取消注释命令。

进阶功能

sed的行选择功能非常强大。除了通过数字指定第一行和最后一行之外,还可以通过正则表达式指定它们。所以,如果你想从命令包含一个所有行foo到一个包含bar,使用:

comment '/foo/,/bar/' bla.conf

BSD(OSX)系统

使用BSD sed时,该-i选项需要一个参数,即使它只是一个空字符串。因此,例如,将上面的top命令替换为:

sed -i '' '2,4 s/^/#/' bla.conf

并且,将脚本中的命令替换为:

sed -i '' "$1"' s/^/#/' "$2"

1
期权'之后的加倍是否是-i故意的?不需要他们
raphinesse


2

您可以在Ex模式下使用Vim:

ex -sc 'g/^\s*[^#]/s/^/#/' -cx bla.conf
ex -sc 'g/^\s*#/s/#//' -cx bla.conf
  1. g 全球正则表达式

  2. s 替代

  3. x 保存并关闭


2

您可以创建一个带有函数的bash_file以便在项目中重用它

#!/bin/bash

# your target file
CONFIG=./config.txt

# comment target
comment() {
  sed -i '' "s/^$1/#$1/" $CONFIG
}

# comment target
uncomment() {
  echo $1
  sed -i '' "s/^#$1/$1/" $CONFIG
}


# Use it so:
uncomment enable_uart
comment arm_freq
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.