0

次のスクリプトがあり、実行しようとしています:

BEGIN {
  start = 0
}

{
  if (match($0, "<WorkflowProcess ")) {
    startTag++
  }  

  if ((startTag < 2) || (endTag == startTag)) {
    print
  }

  if (match($0, "</WorkflowProcess>")) {
    endTag++
  }
}

ただし、常に次のエラーが発生します。

awk: 6 行目付近の構文エラー

awk: 6 行目の近くに不正なステートメントがあります

awk: 10 行目付近の構文エラー

awk: 10 行目付近で救済

何かご意見は?dos2unix と tr -d '\r' を使用して変換しようとしましたが、それでも同じ問題です。ファイル名と拡張子 (/export/home/test/file.txt) を含むフルパスを送信する場合、入力パラメーターは正しいと思います。すべてのファイルには 0777 があります。

4

3 に答える 3

1

SunOSnawkでは、多くの場合、より良い選択です:

nawk -f script.awk /export/home/test/file.txt
于 2013-10-08T15:22:38.273 に答える
1

そのプログラムをどのように実行しようとしますか?

を使用するawk "... all that program ..."と、シェルは$0独自のパスに展開されます。これにはおそらく先頭があり/ます...ただし、今見てみると、内部で以前に失敗するはず"です。それでも、正確なコマンド ラインが表示されると便利です。

ところで、なんで電話しているのmatch?次のように書く方がはるかに慣用的です。

awk '
    /<WorkflowProcess /  { ++startTag }
    startTag < 2 || startTag == endTag { print }
    /</WorkflowProcess>/ { ++endTag }
'

$0これは、完全に明示的に使用することを避けます。

于 2013-10-08T15:15:10.287 に答える
0

ルールでは、ではなくBEGINを初期化しますが、次のルールでインクリメントします。私は知っています、これはGNU awkとすべてで動作しますが、初期化を試してみるべきかもしれません.startstartTagstartTagstartTag

于 2013-10-08T17:27:31.430 に答える