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

Kok*_*zzu 44 shell-script text-processing

有没有办法使用命令行注释/取消注释 shell/config/ruby 脚本?

例如:

$ comment 14-18 bla.conf
$ uncomment 14-18 bla.conf
Run Code Online (Sandbox Code Playgroud)

这将添加或删除#的标志bla.conf线1418。通常我使用sed,但我必须知道这些行的内容,然后进行查找替换操作,当有不止一根针时,这会给出错误的结果(我们只想替换第 N 个一)。

Joh*_*024 57

要评论 bla.conf 的第 2 到 4 行:

sed -i '2,4 s/^/#/' bla.conf
Run Code Online (Sandbox Code Playgroud)

要创建您想要的命令,只需将上述内容放入名为 comment 的 shell 脚本中:

#!/bin/sh
sed -i "$1"' s/^/#/' "$2"
Run Code Online (Sandbox Code Playgroud)

除了第一行和最后一行用逗号而不是破折号分隔之外,此脚本的用法与您的相同。例如:

comment 2,4 bla.conf
Run Code Online (Sandbox Code Playgroud)

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

高级功能

sed的选线功能相当强大。除了通过数字指定第一行和最后一行之外,还可以通过正则表达式来指定它们。因此,如果要命令从包含foo到包含的所有行bar,请使用:

comment '/foo/,/bar/' bla.conf
Run Code Online (Sandbox Code Playgroud)

BSD (OSX) 系统

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

sed -i '' '2,4 s/^/#/' bla.conf
Run Code Online (Sandbox Code Playgroud)

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

sed -i '' "$1"' s/^/#/' "$2"
Run Code Online (Sandbox Code Playgroud)

  • +1 在您的回复中考虑 OSX 系统 <3 (2认同)

Gil*_*il' 12

使用 GNU sed(用-i选项替换文件):

sed -i '14,18 s/^/#/' bla.conf
sed -i '14,18 s/^##*//' bla.conf
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以创建一个带有函数的 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
Run Code Online (Sandbox Code Playgroud)