3

awk を使用して一部のプログラム ファイルを処理し、デバッグ セクションを削除しています。これらのファイルの中には、末尾に改行がないものがあります。awk で改行を使用して行ごとにファイルを印刷したいのですが、改行が存在しない場合は最後に余分な改行を追加しません。

例えば

a
b // no newline after the "b"

これに変わりつつあります:

a
b<NEWLINE>

この改行を追加したくない理由はcmp --silent $file $file_without_debug_sections、元のファイルと新しいファイルのどちらを使用するかを決定するために使用しようとしているからです。私がそれを気にする理由、コンパイラ出力でデバッグ拡張子を持つファイルの数を制限しようとしているからです。異なる場合にのみ非デバッグ バージョンを使用すると、この「デバッグ セクションの削除」プロセスによってどのファイルが変更されたかが明確になります。

要約すると、awk でファイルを 1 行ずつ処理する方法を教えてください。

私の現在のコードは次のようになります。

{    
    if ($0 ~ /^[ \t]*\/\/[ \t]*\/\*[ \t]*begin[ \t]+debug[ \t]*$/) { 
        print "/* begin debug"; 
    } else if ($0 ~ /^[ \t]*\/\/[ \t]*end[\ t]+debug[\t ]*\*\/[ \t]*$/) { 
        print "end debug */";
    } else print;
}

print最後に を に置き換えてみましたprintf "%s", $0。ただし、代わりにすべての行から改行を省略します。

4

2 に答える 2

3

print lineステートメントを次のように変更しますprintf "%s%s", line, RT

例えば

$ seq 3 > s3
$ head -c -1 s3 > s3nn                      # remove last newline
$ awk '$1=$1{printf "%s%s", $0, RT}' s3nn
1
2
3$ awk '$1=$1' s3nn
1
2
3
$ cat s3nn
1
2
3$

あなたの場合print、引数なしは等しいですprint $0

于 2016-01-05T16:58:07.177 に答える