
ファイルからコマンドセットをロードし、ファイルセットから各コマンドセットを実行できるbashキューを作成しようとしています。準備されたファイルは、手動bashキューで実行するためのテンプレートとして機能する必要があります。
準備されたファイルsed.sh
:(
ファイルにもコメントがありますが、ここに追加する方法がわかりません)
sed -e 's,something_complex_long,something_even_longer,'
sed -e 's,other_complex_long_thing,something_so_much_longer,'
sed -e 's,another_long_stuff,something_hell_long,'
aa
ab
ac
そして、などの一般的な名前を持つかなり大きなファイルセットを含むディレクトリがあります(より大きなファイルに切り捨てるには分割を使用してください)。
だから私は次のことを試みます:
sedie=\`grep -v -e '^#' ../../sed.sh\`
for i in *
do
for b in $sedie
do
cat $i | $b > ${i}.new
mv ${i}.new $i
done
done
もちろん、これは2番目の文がfor
空白のために文を破るので完全に失敗します。$sedie
それからどこかで見つけたものを使い続けようとしましたが、IFS
それでも大きな進歩はありませんでした。それから、私が望むものを区別するのに役立つように、コマンドを一種の配列にロードする必要があると思いました。おそらくソースのsed.sh
ようなものでしょうか?arr=("sed " "sed " "sed ")
sed.sh
for b in ${arr[*]}
これをエレガントな方法(例えば再利用可能)で手動で処理する方法を知っている人はいますか?
私のIFS
試みはかなり面倒で、とにかく動作しませんでした...$b
ステートメント、スペースなどに変わり、そのようなコマンドはありませんでした
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
sedie=\`grep -v -e '^#' ../../sed.sh\`
for i in *
do
for b in $sedie
do
echo cat $i \| $($b) \> ${i}.new
echo mv ${i}.new $i
done
done
IFS=$SAVEIFS
これはまったくエレガントではありません。
アップデート#1
次の質問を使用してください。Bashスクリプトを使用してファイルの内容を配列に抽出する これ:変数に保存されたコマンドを実行するには?、もうできます…
$ cat > myfile
aaaaaaaa
aaaaaaa
aaaaaa
aaaa
aa
aaaa
$ cat sed.sh
sed -e 's/a/b/g'
sed -e 's/b/c/g'
sed -e 's/c/f/g'
$ declare -a pole
$ readarray pole < sed.sh
$ for ((i=0;i<${#pole[@]};i++));do \
eval ${pole[i]} xfile > xfile.b; mv xfile.b xfile; done;
$ cat xfile
ffffffff
fffffff
ffffff
ffff
ff
ffff
それが私が必要とするすべてです。だから私の質問は基本的に2つです。
ファイルを配列として読み取るには?
そして
変数からコマンドを実行するには?
答え1
これはまさに望むものではないかもしれませんが、sedを使用しているように見えるので、実行したいsedコマンドだけを含むsed.cmdファイルを作成できます。
s,something_complex_long,something_even_longer,
s,other_complex_long_thing,something_so_much_longer,
s,another_long_stuff,something_hell_long,
テストsed.cmdで次のものを使用しました。
s/dog/cat
次に、このコマンドを配列に読み込み、このコマンドを渡す sed を呼び出すスクリプトを作成します。
array=()
# Read the file in parameter and fill the array named "array"
getArray() {
i=0
while read line # Read a line
do
array[i]=$line # Put it into the array
i=$(($i + 1))
done < $1
}
getArray "sed.cmd"
for cmd in "${array[@]}"
do
ls -1 | while read line
do
cat $line | sed -e $cmd > ${line}.new
mv ${line}.new $line
done
done
ファイルをソートするためにlsコマンドを変更したい場合がありますが、上記のコマンドは必要に応じて実行されるようです。