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

Posted

技术标签:

【中文标题】从文件中删除所有以 # 开头的行【英文标题】:Delete all lines beginning with a # from a file 【发布时间】:2012-01-02 15:00:36 【问题描述】:

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

【问题讨论】:

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

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

sed '/^#/d'

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

【讨论】:

短版:sed /^#/d 对于像我这样的 Linux 新手:sed '/^#/ d' < inputFile.txt > outputFile.txt 最短版本:sed -i '/^#/d' filepath. sed -i '' '/^#/d' filepath 在 Mac (because the -i suffix is mandatory) @Viesturs 试试这个:awk '/^#/ && !first first=1 ; next print $0' 【参考方案2】:

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

grep -v '^#' filename

这解决了上述问题。

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

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

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

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

grep -v '^ *#' filename

如果空白只是空格,或者

grep -v '^[  ]#' filename

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

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

【讨论】:

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

雷蒙德解决方案的反面:

sed -n '/^#/!p'

"不打印任何内容,除了不以#开头的行"

【讨论】:

【参考方案4】:

你可以直接编辑你的文件

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【参考方案5】:

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

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

【讨论】:

【参考方案6】:

此答案基于之前的 answer by Keith。

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

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

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

【讨论】:

假设您的 egrep 支持该语法;旧版本可能不会。【参考方案7】:

您可能还想删除空行

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

以上是关于从文件中删除所有以 # 开头的行的主要内容,如果未能解决你的问题,请参考以下文章

删除CSV文件中不以python中的数字开头的所有行

如何删除所有不以某些字符开头的行?

使用 sed 删除所有以模式 b 开头的行,然后是模式 a 的行

自建yum仓库;编译安装http2.4 ;删除/etc/fstab文件中所有以#开头的行;sed 取本机的IP地址;sed命令取目录名

sed 练习

vim删除空行和注释