从文件中间删除“#”注释行

时间:2013-01-17 16:39:52

标签: bash shell

我想从文件中间删除以“#”开头的注释行,而不删除文件顶部的标题注释行。我怎么能使用shell脚本和标准的Unix工具来做到这一点?

#DO NOT MODIFY THIS FILE.
#Mon Jan 14 22:25:16 PST 2013
/test/v1=1.0
#PROPERTIES P1.   <------REMOVE THIS 
/test/p1=1.0
/test/p2=1.0
/test/p3=3.0
/test/p41=4.0
/test/v6=1.0
#. P2 PROPERTIES   <------REMOVE THIS
/test/p1=1.0
/test/p2=1.0
/test/p3=3.0
/test/p41=4.0
/test/v6=1.0
.................
.................

输出

#DO NOT MODIFY THIS FILE.
#Mon Jan 14 22:25:16 PST 2013
/test/v1=1.0
/test/p1=1.0
/test/p2=1.0
/test/p3=3.0
/test/p41=4.0
/test/v6=1.0
/test/p1=1.0
/test/p2=1.0
/test/p3=3.0
/test/p41=4.0
/test/v6=1.0
.................
.................

5 个答案:

答案 0 :(得分:3)

您可以尝试awk

awk 'NR==1 || NR==2 || !/^#/' file.txt

答案 1 :(得分:2)

如果您不想使用awk:

head -n 2 file.txt > output.txt
grep -v "^#.*" file.txt >> output.txt

答案 2 :(得分:1)

你想要回显以'#'开头的行,但只在开头,只使用bash?以布尔值start=true开头;然后逐行,当行不以start=false开头时设置#,并且只有当你在开头或者行不以{{1}开头时才回显每一行}。

这是文件#

script

运行它:

#!/bin/bash

start=true
while read line; do
    if $start; then
        if [ "${line:0:1}" != "#" ]; then
            start=false
        fi
    fi
    if $start || [ "${line:0:1}" != "#" ];  then
        echo "${line}"
    fi
done

答案 3 :(得分:1)

使用GNU sed,你有

sed '3,${/^#/d}' 

答案 4 :(得分:0)

这可能适合你(GNU sed);

 sed '/^[^#]/,$!b;/^#/d' file