对命令感到困惑: sed '/^#/d' ~/.profile

对命令感到困惑: sed '/^#/d' ~/.profile

我需要知道这个命令的作用。

sed '/^#/d' ~/.profile

该命令给我的输出是这样的:

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

我知道这个命令:

sed '/^$/d' file.txt

意思是删除 中的空白行file.txt

我知道这#可能意味着命令或注释的结束。

我知道$表示命令开始。

具体命令是什么

sed '/^#/d' ~/.profile

做?

答案1

命令sed

sed '/^#/d' ~/.profile

将删除从文件的一行开头开始的所有 shell 注释~/.profile,例如以下两行的第一行,但不是第二行:

# comment
  # indented comment

它通过尝试#在行的开头 ( ^) 进行匹配来实现此目的,并将删除 ( d) 任何匹配的行。

要从 shell 脚本中删除缩进注释,请使用

sed '/^[[:blank:]]*#/d' file

[[:blank:]]将匹配空格字符和水平制表符。


$仅表示“命令的开始”,因为它是 shell 使用的常见提示符,提示您在命令行上键入某些内容。

#是在 shell 中引入注释的字符。sed除了匹配#输入1中的 a 之外,它在脚本中没有任何作用。我从未见过它用来表示“命令结束”。


1如果在命令之间使用,该#角色也会在脚本中引入注释。sed

答案2

/^#/匹配^以 ( )开头的行#d删除它们。默认操作sed是打印该行(除非-n给出),因此会打印其他任何内容。

我知道这#可能意味着命令或注释的结束。

我知道$表示命令开始。

嗯,不。在正则表达式中,^标记字符串(或行)的开始、$结束。#用作注释字符,因此通常位于行的开头。

请注意,许多用作#注释字符的文件允许在命令之后使用它,否则不能直接在行的开头使用。它可以缩进,如示例输出中剩余的注释所示。

/^ *#/d(或/^[ \t]*#/d) 这样的东西可能会更好,因为它也会删除缩进的注释。

相关内容