我是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
”和“ ”之间都有一个空行。data3
sample.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