LOLOLOL
というテキストファイルを編集する割り当てがあります。
HRFJGEKGJHEJGKJVNEJGKJEG BOB BO B
GARY gARY gARY gary
FOG GARY bob bob bob Gary gary
the the bird in the the bush!
LOL MATE!
lolz.script
というbashスクリプトファイルがあります。
#!/bin/bash
sed '1i Hee hee hee\n Ho Ho Ho\n' $1
sed 's/bob/Bob/g' $1
コマンドラインで.\lolz.script LOLOLOL
を実行すると、LOLOLOL
テキストの正確な繰り返し、sedコマンドごとに1回の繰り返しが得られます。
たとえば、出力には、最初と2番目のsedコマンド(それぞれに適用)が示されています。
*Hee Hee Hee
Ho Ho Ho*
HRFJGEKGJHEJGKJVNEJGKJEG BOB BO B
GARY gARY gARY gary
FOG GARY bob bob bob Gary gary
the the bird in the the bush!
LOL MATE!
HRFJGEKGJHEJGKJVNEJGKJEG BOB BO B
GARY gARY gARY gary
FOG GARY *Bob Bob Bob* Gary gary
the the bird in the the bush!
LOL MATE!
出力したいもの:
*Hee Hee Hee
Ho Ho Ho*
HRFJGEKGJHEJGKJVNEJGKJEG BOB BO B
GARY gARY gARY gary
FOG GARY Bob Bob Bob Gary gary
the the bird in the the bush!
LOL MATE!
ご覧のとおり、各sedコマンドは、テキストファイルの印刷の各反復で独立してが適用されます。すべてのsedコマンドを適用する必要がありますtogether。
最初の反復で最初のsedコマンドからの目的のヘッダーが適用され、2番目の反復では適用されないことに注意してください(ただし、bob
からBob
への変更は適用されます)。
なぜこれが起こったのですか?スクリプト内のコマンドを1つのテキストファイルに累積的にするにはどうすればよいですか?これは、同じ形式のawk
スクリプトでは発生しなかったようです。
単純:sed
を2回呼び出しています。
端末でこれらのコマンドを次々に実行すると、2セットの出力が作成されます。スクリプトは、独自のシェルで同じことをしているだけです。
{}
を使用してコマンドをグループ化し、各コマンドを新しい行に置くか、;
を使用して、すべてのコマンドが累積的にファイルに作用し、sedを1回だけ呼び出すことができます。
#!/bin/bash
sed '{
1i Hee hee hee\n Ho Ho Ho\n
s/bob/Bob/g
}' "$1"
./script file
の出力
Hee hee hee
Ho Ho Ho
HRFJGEKGJHEJGKJVNEJGKJEG BOB BO B
GARY gARY gARY gary
FOG GARY Bob Bob Bob Gary gary
the the bird in the the bush!
LOL MATE!