2

我想从文件中间删除以“#”开头的注释行,而不删除文件顶部的标题注释行。如何使用 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
.................
.................
4

5 回答 5

4

你可以试试awk

awk 'NR==1 || NR==2 || !/^#/' file.txt
于 2013-01-17T16:45:58.943 回答
3

如果您不想使用 awk:

head -n 2 file.txt > output.txt
grep -v "^#.*" file.txt >> output.txt
于 2013-01-17T16:51:28.447 回答
1

您想回显以“#”开头的行,但仅在开头,仅使用 bash?以布尔值开头start=true;然后逐行进行,start=false在该行不以 开头时设置#,并且仅当您在开头或该行不以 开头时才回显每一行#

这是文件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

运行它:

$ cat input
#DO NOT MODIFY THIS FILE.
#Mon Jan 14 22:25:16 PST 2013
/test/v1=1.0
#PROPERTIES P1.
/test/p1=1.0
/test/p2=1.0
/test/p3=3.0
/test/p41=4.0
/test/v6=1.0
#. P2 PROPERTIES
/test/p1=1.0
/test/p2=1.0
/test/p3=3.0
/test/p41=4.0
/test/v6=1.0
$ ./script < input
#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
于 2013-01-17T16:51:35.677 回答
1

使用 GNU sed,你有

sed '3,${/^#/d}' 
于 2013-01-17T18:49:23.613 回答
0

这可能对你有用(GNU sed);

 sed '/^[^#]/,$!b;/^#/d' file
于 2013-01-17T21:31:56.857 回答