質問

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

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

編集:

#!/usr/bin/env sh

cmd1
cmd2
cmd3
cmd4
cmd5
cmd6
cmd7
cmd8

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

役に立ちましたか?

解決

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"

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

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

他のヒント

大まかに言って:

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

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

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

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

#!/bin/sh

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

&quot; test.txt&quot;の最初の12行をコメントアウトします。あなたの例では、&quot; $ FILE&quot; または同様の(引用符を含む!)を試すことができます。

その後、通常の方法で実行します。つまり、 ./" $ FILE&quot;

edit: $ SHELL&quot; $ FILE&quot; は、おそらく(上記のコメント投稿者の1人から)それらを実行するためのより良いアプローチです。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top