sed去除注释行:sed -i -c -e '/^#/d' config_file
sed去除空行: sed -i -c -e '/^$/d' config_file
sed去空行和注释行:sed -i -c -e '/^$/d;/^#/d' config_file
[root@rac1 ~]# cat a
a
b
adss
afdsf
af #
o
#asd
##
asdf # adfas fad af # a ds
[root@rac1 ~]# sed -i -c -e '/^$/d;/^#/d' a
[root@rac1 ~]# cat a
a
b
adss
afdsf
af #
o
asdf # adfas fad af # a ds
2.使用命令及方法
1. 使用 `sed` 命令
`sed` 是一个流编辑器,可以用来对文本进行过滤和转换。对于大多数配置文件,注释通常以 `#` 开头。你可以使用以下命令去除所有以 `#` 开头的行:
sed -i '/^#/d' filename.conf
#这里,`-i` 选项表示直接修改文件,`/^#/d` 是一个正则表达式,表示删除所有以 `#` 开头的行。
d =delete
2. 使用 `awk` 命令
`awk` 是一个强大的文本处理工具,可以对文件进行复杂的文本操作。以下命令将删除所有包含 `#` 的行:
awk '!/#/' filename.conf > filename_no_comments.conf
这个命令将不包含 `#` 的所有行输出到一个新文件 `filename_no_comments.conf`。如果你想直接在原文件上进行更改,可以使用 `gawk`(GNU awk)的 `--in-place` 选项:
gawk '!/#/' filename.conf --in-place
3. 使用 `grep` 命令
`grep` 命令用于搜索文本,并且可以用来删除包含特定模式的行。以下命令将删除所有包含 `#` 的行:
grep -v '^#' filename.conf > filename_no_comments.conf
同样,这个命令将输出到一个新文件中。如果你想直接修改原文件,可以使用 `sed` 命令,如上所述。
注意事项
- 在使用上述命令之前,请确保你有文件的备份,以防不小心覆盖或损坏重要数据。
- 某些配置文件可能包含以 `#` 开头的行,但这些行实际上是有效的配置项(例如,某些 `.bashrc` 或 `.bash_profile` 文件)。在使用这些命令时,请确保你了解文件的结构,以免意外删除重要配置。
- 如果你的配置文件使用了其他注释符号(如 `;` 对于 INI 文件),你需要根据实际情况调整正则表达式。
以上命令假设注释符号是 `#`。如果你的配置文件使用了不同的注释符号,只需将正则表达式中的 `#` 替换为相应的注释符号即可。
------------------------只是去掉注释--------
[root@rac1 ~]# cat a
asdf # adfas fad af # a ds
o
#/dev/sdb1
[root@rac1 ~]# sed -i '/^#\/dev\/sdb1/ s/^#//' a
[root@rac1 ~]# cat a
asdf # adfas fad af # a ds
o
/dev/sdb1
---两个##注释,还有特殊符号
[root@rac1 ~]# sed -i '/^\/dev\/sdb1/ s/^/##/' a
[root@rac1 ~]# cat a
asdf # adfas fad af # a ds
o
##/dev/sdb1
[root@rac1 ~]# sed -i '/^#\/dev\/sdb1/ s/^#//' a---失败
[root@rac1 ~]# cat a
o
##/dev/sdb1
[root@rac1 ~]# sed -i '/^##\/dev\/sdb1/ s/^##//' a
[root@rac1 ~]# cat a
asdf # adfas fad af # a ds
o
/dev/sdb1
[root@rac1 ~]#
----------------------------进阶
使用sed命令在文件中删除以特定标记开始的注释行内容
sed -ri "s:^([ ]*)[$comment_mark]+[ ]?([ ]*$regex):\\1\\2:" "$file"
这是一个使用 `sed` 的命令,用于在文件中进行正则表达式的替换。我们逐步解析这个命令:
1. **`sed`**:这是一个流编辑器,用于对输入流(或文件)进行基于文本模式的操作。
2. **`-r`**:这个选项是告诉 `sed` 使用扩展正则表达式(ERE)。在ERE中,某些字符(如 `+`、`?`、`|`、`{}` 等)可以直接使用,而不需要转义。
3. **`-i`**:这个选项告诉 `sed` 直接修改文件内容,而不是输出到标准输出。
4. **`"s:^([ ]*)[$comment_mark]+[ ]?([ ]*$regex):\\1\\2:"`**:这是 `sed` 的替换命令,格式是 `s/PATTERN/REPLACEMENT/`。这里使用的是 `:` 作为分隔符,而不是常见的 `/`。
* **`^([ ]*)`**:匹配行的开始,并捕获0个或多个空格。
* **`[$comment_mark]+`**:匹配一个或多个 `$comment_mark` 字符。注意 `$comment_mark` 是一个变量,代表某个特定的字符或字符集。
* **`[ ]?`**:可选地匹配一个空格。
* **`([ ]*$regex)`**:捕获0个或多个空格,然后捕获 `$regex` 所代表的正则表达式。同样,`$regex` 也是一个变量。
* **`\\1\\2`**:在替换部分,`\1` 和 `\2` 分别代表上面提到的第一个和第二个捕获组。这意味着替换后的行将保留原始的前导空格和由 `$regex` 捕获的部分,但删除 `$comment_mark` 和其后的可选空格。
5. **`"$file"`**:这是 `sed` 命令要处理的文件的名称。这里 `$file` 是一个变量,代表实际的文件名。
**举例**:
假设 `$comment_mark` 是 `#`,`$regex` 是 `.*`(匹配任何字符0次或多次),并且我们有一个名为 `example.txt` 的文件,内容如下:
sed -ri "s:^([ ]*)[$comment_mark]+[ ]?([ ]*$regex):\\1\\2:" "$file"
在txt文本中 ---用$comment_mark 替换成#
sed -ri "s:^([ ]*)[#]+[ ]?([ ]*.*):\\1\\2:" example.txt
# This is a comment
Another line # with comment
Yet another line
执行这个 `sed` 命令后,`example.txt` 的内容将变为:
[root@rac1 ~]# sed -ri "s:^([ ]*)[#]+[ ]?([ ]*.*):\\1\\2:" example.txt??不知道哪里错了
sed: -e expression #1, char 32: unknown option to `s
[root@rac1 ~]# sed -ri "s:^([ ]*)[#]+[ ]?([ ]*.*):\\1\\2:" example.txt---可以
[root@rac1 ~]# cat example.txt
# This is a comment
Another line # with comment
Yet another line
[root@rac1 ~]# sed -ri "s:^([ ]*)[#]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# cat example.txt
This is a comment
Another line # with comment
Yet another line
[root@rac1 ~]# vi example.txt
[root@rac1 ~]# cat example.txt
#This is a comment
Another line # with comment
Yet another line
# second comment
[root@rac1 ~]# sed -ri "s:^([ ]*)[#]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# cat example.txt
This is a comment
Another line # with comment
Yet another line
second comment
[root@rac1 ~]#
-----删除空格开头
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# cat example.txt
This is a comment
Another line # with comment
Yet another line
second comment
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# cat example.txt
This is a comment
Another line # with comment
Yet another line
second comment
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# cat example.txt
This is a comment
Another line # with comment
Yet another line
second comment
[root@rac1 ~]#
----[ ] 空格再多没有意义
[root@rac1 ~]# cat example.txt
This is a comment
Another line # with comment
i Yet another line
second comment
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# cat example.txt
This is a comment
Another line # with comment
i Yet another line
second comment
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# sed -ri "s:^([ ]*)[ ]+[ ]?([ ]*.*):\\1\\2:" example.txt
[root@rac1 ~]# cat example.txt
This is a comment
Another line # with comment
i Yet another line
second comment
[root@rac1 ~]#