たとえば、file.txtの唯一のコンテンツは次のとおりです。
xxxxxxxxxHAHAxxxxxxHOHOxxxxxxx
HAHAをseq 1 3に変更し、HOHOをseq 5 7に変更したいので、出力は次のようになります。
xxxxxxxxx1xxxxxx5xxxxxxx
xxxxxxxxx2xxxxxx6xxxxxxx
xxxxxxxxx3xxxxxx7xxxxxxx
私がしたこと:
for i in $(seq 1 3)
do sed "s/HAHA/$i/g" file.txt
for i in $(seq 5 7)
do sed "s/HOHO/$i/g" file.txt
done
done > new.txt
しかし、new.txtは私が期待したものを表示しません。コードをどのように変更する必要がありますか?
ベストアンサー1
bash
組み込みコマンドを使用してread
さまざまなファイル記述子の機能を読み取る方法は次のとおりです。
while read -u3 i && read -u4 j; do
sed -e "s/HAHA/$i/" -e "s/HOHO/$j/" file.txt
done > new.txt 3< <(seq 1 3) 4< <(seq 5 7)
seq
数値には単純な算術関係があるため、単一のプロセス+いくつかのシェル算術を使用する方が簡単です。
for i in $(seq 1 3); do
sed -e "s/HAHA/$i/" -e "s/HOHO/$((i+4))/" file.txt
done > new.txt
どちらの場合も、以下を参照してください。シェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?- 提供した最小限の例では非効率性は重要ではないかもしれませんが、より深刻な作業を行う場合は、他のアプローチを使用することを検討する必要があります。