从文件中删除所有以 # 开头的行
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
【讨论】:
以上是关于从文件中删除所有以 # 开头的行的主要内容,如果未能解决你的问题,请参考以下文章
使用 sed 删除所有以模式 b 开头的行,然后是模式 a 的行
自建yum仓库;编译安装http2.4 ;删除/etc/fstab文件中所有以#开头的行;sed 取本机的IP地址;sed命令取目录名