web-dev-qa-db-ja.com

Sed複数回反復するbashスクリプト

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スクリプトでは発生しなかったようです。

2
KMoy

単純: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!
2
Zanna