web-dev-qa-db-fra.com

Sed script bash itérant plusieurs fois

J'ai une tâche d'édition d'un fichier texte, appelé 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!

J'ai un fichier de script bash appelé lolz.script:

#!/bin/bash

sed '1i Hee hee hee\n Ho Ho Ho\n' $1
sed 's/bob/Bob/g' $1

en exécutant .\lolz.script LOLOLOL sur la ligne de commande, je reçois plusieurs itérations de la variable LOLOLOL text - précisément, une itération par commande.

Par exemple, la sortie affiche les première et deuxième commandes sed (appliquées à chacune) ici:

*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!
  • --- * affiche la partie modifiée du fichier texte dans la sortie.

Considérant ce que je veux la sortie:

*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!

Comme vous pouvez le constater, chaque commande sed est appliquée indépendamment à chaque itération d'impression du fichier texte. J'ai besoin que toutes les commandes sed soient appliquées ensemble.

Notez comment l'en-tête souhaité de la première commande sed est appliqué à la première itération, alors que ce n'est pas le cas à la seconde (mais le changement bob à Bob est).

Pourquoi est-ce arrivé et que puis-je faire pour que les commandes d'un script soient cumulées dans un fichier texte? Cela ne semblait pas se produire avec le script awk de même format.

2
KMoy

Simplement: vous appelez sed deux fois.

Si vous exécutez ces commandes dans un terminal les unes après les autres, vous obtiendrez deux jeux de sortie. Votre script fait juste la même chose dans son propre shell.

Vous pouvez utiliser {} pour regrouper des commandes et les insérer sur une nouvelle ligne, ou bien ; pour que toutes les commandes agissent sur le fichier de manière cumulative, en appelant sed une seule fois:

#!/bin/bash
sed '{
     1i Hee hee hee\n Ho Ho Ho\n
     s/bob/Bob/g
}' "$1"

sortie de ./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