使用 sed 删除文本文件中的注释行

使用 sed 删除文本文件中的注释行

我是sed新手。我想用来sed删除文本文件中的注释行。

在我的一系列文本文件中,注释行开始#符号 或@符号(即,它们是最初用于在 中绘制的文件xmgrace)。假设我有以下示例文件(称为sample.txt):

# Comment 1
# Another comment
# Yet another comment
@ More comments
@ Still more comments
data1
data2

data3

我想使用就地sed修改来获得以下内容:sample.txt

data1
data2

data3

两个版本中的“ data2”和“ ”之间都有一个空行。data3sample.txt

灵感来自这个堆栈溢出问题,我想出了这一系列(连续的)命令:

sed -i 's/#.*$//' sample.txt
sed -i 's/@.*$//' sample.txt

得到以下结果文件:

    <blank line>
    <blank line>
    <blank line>
    <blank line>
    <blank line>
data1
data2

data3

其中<blank line>只是一个空行。 (我必须这样写,以便 Stack Exchange 能够正确格式化输出。)

上面的问题是注释行只是被替换为空行,并没有被完全删除。

(连续)命令的另一种可能性是:

sed -i 's/#.*$//' sample.txt
sed -i 's/@.*$//' sample.txt
sed -i '/^$/d' sample.txt

我从中获得以下输出:

data1
data2
data3

data2然而,上面的内容也是错误的,因为“ ”和“ ”之间的空行data3没有被保留(我错误地不加区别地删除了所有空行)。如何删除注释行?

我运行的是 Ubuntu Linux。谢谢你的时间!

答案1

使用sed删除命令(这里假设 GNUsed在 Ubuntu 和其他 GNU 系统上找到)。

 sed -i '/^[@#]/ d' sample.txt

如果您需要考虑前导空格字符:

sed -i '/^\s*[@#]/ d' sample.txt

答案2

grep '^[^@#]' < file.in > file.out

将为您提供以任何字符开头的行,但@有效#地删除#foo,@foo行以及空行。

grep -v '^[@#]' < file.in > file.out

将保留空行。如果您想考虑在,之前有空格的行@#

grep -v '^[[:blank:]]*[@#]' < file.in > file.out

并删除空行:

grep '^[[:blank:]]*[^[:blank:]@#]' < file.in > file.out

相关内容