2

ファイルの先頭にあるヘッダー コメント行を削除せずに、ファイルの途中から "#" で始まるコメント行を削除したい。シェル スクリプトと標準の 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

GNU sedを使用すると、

sed '3,${/^#/d}' 
于 2013-01-17T18:49:23.613 に答える
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 に答える
0

これはうまくいくかもしれません(GNU sed)。

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