2012-03-01 14 views
2

他のファイルからスクリプトをインポートするためにimportコマンドとloadコマンドを使用するスクリプトファイルがあります。これらのスクリプトを新しい言語に変換しようとしていますが、さまざまなインポート/ロードのすべてを通して変数を追跡するのは難しいです。私はファイルを通過し、それが呼び出されたインクルード/インポートされたファイルからすべてのテキストをインポートするBASHスクリプトを作成しようとしています。ファイルをBashでマージする

最終的な解決策!オリジナルファイルの

sed -e 's/\\/\//g' test.restomatic | awk '{if ($1 ~ /^(LOAD|IMPORT)/) system("cat " $2); else print;}' > /cygdrive/c/bashScripts/testing.txt 

サンプル:出力ファイルの望ましい結果の

LOAD ..\..\..\..\GlobalSuccess\IdentityShardCreate_Success.rcq 
REPLACE /rest-client/request/url/*shard* "//{$OKEnv}" 
EXPECT HEADER SERVER 
EXPECT HEADER DATE 
EXPECT RETURN-CODE 201 
RUN 
IMPORT ..\..\..\..\GlobalSuccess\IdentityEnvironmentCreateNewEnvironmentFromShard_Success.rcq 
REPLACE /rest-client/request/url/*shard* "//{$OKEnv}/environment" 
EXPECT HEADER Server 
EXPECT HEADER Date 
EXPECT RETURN-CODE 204 
RUN 
ASSIGN ShardTypeControl 1 
LOOP ShardTypeControl 
ASSIGN OKShard2 {$ShardNames[{$ShardTypeControl}]} 
LOAD ..\..\..\..\GlobalSuccess\IdentityEnvironmentAddShardToEnvironment_Success.rcq 
REPLACE /rest-client/request/url/*shard* "//{$OKShard2}/environment/{$OKEnv}" 

例:

Original File (OF) Start 
(OF) Line 1 
(OF) Line 2 
(OF) Line 3 
Line 1 of Imported File - would have been (OF) line 4 
Line 2 of Imported File 
(OF) Line 5 
(OF) Line 6 
Line 1 of Loaded File - would have been (OF) line 7 
Line 2 of Loaded File 
Line 3 of Loaded File 
(OF) Line 8 
Line 1 of Second Imported File - would have been (OF) line 9 
Line 2 of Second Imported File 
+1

あなたの入力ファイルのサンプルを含めるように編集してください。input-> outputを理解するのに十分です。 (行数が少なくてもOKです)。また、ビルドしている出力は、さらに自動化された後処理のための悪夢のように見えます。しかし、人間が読める形式のレポートであれば、おそらくOKです。がんばろう。 – shellter

+2

アヒルは何ですか? –

+0

サンプル出力は完全に「擬似コード」であり、実際の出力は文字通りベースファイルからの線か、それが引っ張っていたファイルのどちらかでなければならないことに注意してください。 – jheep

答えて

3

すべてがこのような単一awkコマンドで組み合わせることができます。

awk '{if ($1 ~ /^(LOAD|IMPORT)/) {gsub(/\\/, "/", $2); system("cat " $2)} else print}' test.txt > output.txt 
+0

素敵なハックですが、必ずしも彼のために物事を適切にインターリーブするとは思わない。 – Perry

+0

私はこれに新しく、これが何をしているのか分かりません。 awkはファイル内のすべてを参照に変換しますか?私は助けに感謝します。しかし、私はそれが実行されていないときにこのようなトラブルシューティングを試みることさえできません。 – jheep

+0

@Perry:どうしてそうじゃないの? 'system()'関数は(コマンドの終了ステータスを返すので)完全に同期しており、保留中の出力を移植可能にしてすべてのバッファからフラッシュします。私は何が欠けていますか? – ruakh

0

私がここで理解できるものから、あなたは、いくつかの中に輸入をインラインしようとしています使用しているスクリプト言語(指定していない)を使用すると、スクリプト全体を含む1つのファイルになりますので、そのスクリプトを別の(不特定の)言語。

あなたが書いたbashスクリプトは、test.txtに記載されているすべてのファイルを、言及されている順に出力ファイルに連結することになります。元のテキストとインポートされたテキストが混在することはありません後になります。

私は全く異なるアプローチを提案します。 sedを使用してIMPORT文をcpp #include文またはm4と同等のものに変換し、結果ファイルをcppまたはm4を通して(丁重に)実行します。ハックのビットですが、それはあなたが探している結果を正確に生成します。

+0

お返事ありがとうございます。元のスクリプト言語はほとんどがBASHだと私は信じています。私はここで新しいですし、テストケースをPHPに変換しています。最終的には人間が消費するために読めるようにする必要があるので、ロジックが完全であることを確認することができます。私はあなたが参照しているcpp #includeまたはm4に精通していません。彼らが何であるかについての最初の検索は明確ではなかった。 – jheep

+0

IMPORTはBashのコマンドではないので、Bashスクリプトにどのように表示されるのかわかりません。 "cpp"はCプリプロセッサです。あなたはそれのためのマニュアルページを見つけるでしょう。 "m4"は一般化されたマクロプロセッサであり、そのためのマニュアルページもあります。いずれかを使用して、あるファイルを別のファイルにインポートすることができます。 – Perry

2
while IFS= read -r line; do 
    case "$line" in 
    LOAD *|IMPORT *) cat "${line#* }" ;; 
    *) echo "$line" ;; 
    esac 
done < original.file 

問題のコードのいくつかのコメント:

cat /path/original.file | while read $line; do 
if[grep 'IMPORT\|LOAD' $line]; then    
working on it 
else 
working on it: output to file /path/testing.txt 
done 
  • はなし(while read lineであるべき$
  • [は、コマンドで、前後にスペースを必要とします。grepは、変数の内容を読み取る持ってif [ grep '...' ... ]; then
  • if声明
  • ための終端キーワードfiを逃すのbashの「ここに文字列」リダイレクションを使用
    grep 'IMPORT\|LINE' <<< "$line"
  • 引用符をオフにすることによる副作用を特に必要としない限り、常に変数参照を引用してください。
+0

これは、実際に彼が元々やったこととは異なる何もしていません。元のソースファイルとインポートされたコードがインターリーブされないため、動作しません。あなたがしたことは、逆引用符をxargsに置き換えることでした。 – Perry

+0

@Perry、true。私は完全にその点を逃した。更新しました。 –

+0

あなたの改訂版は悪くありません。 – Perry

関連する問題