ChatGPT解决这个技术问题 Extra ChatGPT

从文件中删除所有以 # 开头的行

文件中所有带有注释的行都以 # 开头。如何删除以 # 开头的所有行(并且仅删除那些行)?其他包含 # 但不在行首的行应被忽略。

它是否必须与 #blah \<nl>blah 算作单个“逻辑行”的通用约定一起使用,因为反斜杠转义了换行符?
@sarnold:除了 make,还有哪些实用程序使用“在结束评论之前使用反斜杠拼接行”?外壳(经过 bash 和 ksh 测试)没有。 C 和 C++ 确实在预处理器指令的其他处理之前处理换行符拼接,但它们是指令而不是注释。
@乔纳森:太棒了。我曾假设常见的 \<nl> 转义也适用于评论。但是哇我错了。我还没有找到另一个例子...... :) 谢谢!

V
Vlad

这可以通过 sed one-liner 完成:

sed '/^#/d'

这就是说,“找到所有以 # 开头的行并删除它们,留下其他所有内容。”


较短的版本:sed /^#/d
对于像我这样的 Linux 新手:sed '/^#/ d' < inputFile.txt > outputFile.txt
最短版本:sed -i '/^#/d' filepath
以及 Mac 上的 sed -i '' '/^#/d' filepath (because the -i suffix is mandatory)
@Viesturs 试试这个:awk '/^#/ && !first { first=1 ; next } { print $0}'
K
Keith Thompson

我有点惊讶没有人提出最明显的解决方案:

grep -v '^#' filename

如上所述,这解决了问题。

但请注意,一个常见的约定是将从 # 到行尾的所有内容都视为注释:

sed 's/#.*$//' filename

尽管例如将字符串文字中的 # 字符视为注释的开头(这可能与您的情况相关,也可能不相关)(并且它留下空行)。

以任意空格开头后跟 # 的行也可能被视为注释:

grep -v '^ *#' filename

如果空格只是空格,或者

grep -v '^[  ]#' filename

其中两个空格实际上是一个空格,后跟一个文字制表符(键入“control-v tab”)。

对于所有这些命令,省略 filename 参数以从标准输入读取(例如,作为管道的一部分)。


我添加了一个基于此答案的 new answer
我在 Windows 上以这种方式使用 grep 时遇到了麻烦。解决方法是将'替换为",例如grep -v "^#" filename
a
ata

与雷蒙德的解决方案相反:

sed -n '/^#/!p'

“不打印任何东西,除了不以#开头的行”


好的,这里有什么优势?
@lacostenycoder 这与此处介绍的任何其他选项大致相同,足以提及它。
r
rubo77

你可以直接编辑你的文件

sed -i '/^#/ d'

如果您还想删除以一些空格开头的注释行,请使用

sed -i '/^\s*#/ d'

通常,您希望保留脚本的第一行,如果它是一个 sha-bang,那么 sed 不应删除以 #! 开头的行。它还应该删除仅包含哈希但不包含文本的行。把它们放在一起:

sed -i '/^\s*\(#[^!].*\|#$\)/d'

要符合所有 sed 变体,您需要向 -i 选项添加备份扩展:

sed -i.bak '/^\s*#/ d' $file
rm -Rf $file.bak

加 1 表示哪个空间
j
jaypal singh

您可以将以下内容用于 awk 解决方案 -

awk '/^#/ {sub(/#.*/,"");getline;}1' inputfile

C
Community

这个答案建立在前面的 answer by Keith 之上。

egrep -v "^[[:blank:]]*#" 应过滤掉注释行。

egrep -v "^[[:blank:]]*(#|$)" 应该过滤掉评论和空行,这通常很有用。

有关 [:blank:] 和其他字符类的信息,请参阅 https://en.wikipedia.org/wiki/Regular_expression#Character_classes


假设您的 egrep 支持该语法;旧版本可能不会。
A
Ahmed Khaled

您可能还想删除空行

sed -E '/(^$|^#)/d' inputfile

M
Mohsen Abasi

删除所有空行以及任何空格后以 # 开头的所有行:

sed -E '/^$|^\s*#/d' inputfile

例如,请参阅以下 3 行已删除的行(仅包括行号!):

1. # first comment
2.
3.         # second comment

测试上述命令后,您可以使用选项 -i 来编辑输入文件。

只是这个!


f
filmor

这是带有一些扩展名的所有文件的循环:

ll -ltr *.filename_extension > list.lst

for i in $(cat list.lst | awk '{ print $8 }') # validate if it is the 8 column on ls 
do
    echo $i
    sed -i '/^#/d' $i
done