0

大量のデータを処理してデータベースに挿入する準備をするために、一連のシェルスクリプトを生成します。それぞれに約15行あり、データが送信されるテーブルごとに1つずつあります。最近のインポートバッチの1つで、一部のインポートファイルが1つの特定のテーブルに入ることができませんでした。したがって、最初の7行をコメントアウトしてからファイルを再実行する必要がある一連のシェルスクリプト(約600)があります。このフォルダには約6000個のシェルスクリプトがあり、特定のファイルについては、編集が必要かどうかはわかりません。データベース出力から取得したファイルのリストがあります。

では、このファイル名のリストを取得し、それぞれについて最初の7行をコメントアウトしてスクリプトを実行するために、bashスクリプト(またはより適切に機能する他のスクリプト)を作成するにはどうすればよいですか?

編集:

#!/usr/bin/env sh

cmd1
cmd2
cmd3
cmd4
cmd5
cmd6
cmd7
cmd8

それがどれほど読みやすいかわからない。基本的に、最初の7行(最初の行は数えません)には、先頭に#を追加する必要があります。注:ファイルは、各行を短くし、VIMからのコピーを部分的にカットするように編集されています。ただし、各ファイルの主要部分には、echoで始まる行があり、次にsqlldrで始まる行があります。

4

4 に答える 4

4

sedを使用すると、変更するファイルの行番号範囲を指定できます。

#!/bin/bash

while read line
do
    # add a comment to beginning of lines 1 - 7 and rename the script
    sed '3,9 s/^/#/' $line > $line.new
    exec $line.new
done < "filelist.txt"

これらすべてのスクリプトで実行する前に、これをテストすることをお勧めします...

編集:コメントを反映するように行番号を変更しました。

于 2009-10-27T13:58:00.753 に答える
3

大ざっぱに言えば:

#!/bin/sh
for file in "$@"
do
    out=/tmp/$file.$$
    sed '2,8s/^/#/' < $file > $out
    $SHELL $out
    rm -f $out
done

競合状態などのチェックを気にしないと仮定します。

于 2009-10-27T14:03:12.177 に答える
1

最終的には、Linuxコマンドsedを使用することになります。スクリプトに配置する必要のあるロジックが何であれ、ご存知でしょう。ただし、スクリプトは最終的にsedを呼び出します。 http://lowfatlinux.com/linux-sed.html

于 2009-10-27T14:03:03.877 に答える
1

exはあなたがやりたいことのために作られているようです。

たとえば、ヒアドキュメントを使用して1つのファイルを編集する場合:

#!/bin/sh

ex test.txt << END
1,12s/^/#/
wq
END

「test.txt」の最初の12行をコメントアウトします。あなたの例では、試してみることができます"$FILE"(引用符を含む!)。

次に、通常の方法で実行します。./"$FILE"

編集:$SHELL "$FILE"おそらくそれらを実行するためのより良いアプローチです(上記のコメントの1つから)。

于 2009-10-27T14:21:38.487 に答える