1行ずつファイルからbashコマンドをロードし、ディレクトリ内のすべてのファイルに対して実行します。

1行ずつファイルからbashコマンドをロードし、ディレクトリ内のすべてのファイルに対して実行します。

ファイルからコマンドセットをロードし、ファイルセットから各コマンドセットを実行できる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.shfor 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コマンドを変更したい場合がありますが、上記のコマンドは必要に応じて実行されるようです。

おすすめ記事