J'ai une chaîne ( $ pastestring ) avec des retours à la ligne, que j'ai déclarée comme ceci

pastestring = $ '\ n ##### Branch FREEZE activer / désactiver: \ n Gel: activer'

J'ai un document (avec le chemin $ file ). Le document est assez volumineux, mais ma tâche est la suivante: quand je trouve un texte, c'est similaire à cela.

######## Branch Owner #########
Owner: James Jones
Mail: James@gmail.com
###############################

(le nombre de symboles "#" peut donc être différent, les paramètres Propriétaire et Mail peuvent également être différents)

Je dois créer une nouvelle ligne et coller les informations que j'ai à l'intérieur du document, donc cela devrait ressembler à

######## Branch Owner #########
Owner: James Jones
Mail: James@gmail.com
###############################

##### Branch FREEZE enable/disable
Freeze: enable

Tout d'abord, je ne sais pas vraiment comment créer un motif qui m'aidera à trouver un texte, qui ressemble au texte ci-dessus (je ne sais pas, comment créer un motif avec des nouvelles lignes à l'intérieur).

Si j'essaye de coller mon test comme ceci (dans ce cas, je regarde uniquement "############################# "symboles)

sed -i "/ ############################# / a" $ {pastestring} "" $ fichier

Je reçois beaucoup d'erreurs à cause des nouvelles lignes et des symboles spéciaux à l'intérieur de la chaîne.

sed: -e expression #1, char 35: expected \ after `a', `c' or `i'

Toute aide pour résoudre ce problème apprécié!

MISE À JOUR @Inian Le contenu du $ fichier ressemble à ceci

######## Branch Owner #########
Owner: Jones Jane
Mail: Jones@gmail.com
###############################

##### Branch RELEASE enable/disable
Release: disable

##### Branch configuration enable/disable
Release: enable

##### Branch output enable/disable
Release: enable

J'ai besoin de mettre ma chaîne dans un fichier après

######## Branch Owner #########
Owner: Jones Jane
Mail: Jones@gmail.com
###############################

Il peut être identifié, en passant, qu'il semble

##### (some symbols #)
Owner: (some text)
Mail: (some text)
##### (some symbols #)

Et je ne sais pas vraiment comment créer un modèle pour cela.

Le résultat devrait être

######## Branch Owner #########
Owner: Jones Jane
Mail: Jones@gmail.com
###############################

##### Branch FREEZE enable/disable
Freeze: disable

##### Branch RELEASE enable/disable
Release: disable

##### Branch configuration enable/disable
Release: enable

##### Branch output enable/disable
Release: enable

MISE À JOUR @Inian, pouvez-vous jeter un œil à nouveau? Je viens de découvrir un autre problème ici. Vos scripts collent le texte deux fois. Le contenu du fichier est

######## Branch Owner #########
Owner: Jones Jane
Mail: Jones@gmail.com
###############################

##### Branch RELEASE enable/disable
Release: disable

##### Branch configuration enable/disable
Release: enable

##### Branch output enable/disable
Release: enable

##### Branch Contributors #####
user1
user2
user3
user4
yooseftal
markout
(and other users)
###############################


#### Code Review enable/disable
CR: enable

Ainsi, le script colle également le texte après la section Contributeurs de la branche

1
dice2011 4 avril 2017 à 09:40

2 réponses

Meilleure réponse

Si cela ne vous dérange pas d'utiliser Awk pour cela, vous pouvez le faire comme ci-dessous,

pastestring=$'\n##### Branch FREEZE enable/disable:\nFreeze: enable '
awk -v string="${pastestring}" '/Branch Owner/{print; flag=1; next}$0 ~ "^[#]*$" && flag && NF{print; print string; flag=0; next}1' file "$file"

Qui produit une sortie comme ci-dessous,

######## Branch Owner #########
Owner: James Jones
Mail: James@gmail.com
###############################

##### Branch FREEZE enable/disable:
Freeze: enable

La clé de la solution est d'identifier le regex uniquement pour la ligne commençant par # ce qui peut être fait par

$0 ~ "^[#]*$"

Ce qui signifie que si la ligne contient seulement le caractère #, imprimez cette ligne et imprimez la ligne requise et la condition && NF pour vous assurer que l'expression régulière ne fonctionne pas ' t faire correspondre les lignes vides pour effectuer l'insertion d'une nouvelle ligne. Le /Branch Owner/{flag=1; next} vise à garantir qu'aucune autre balise similaire ne correspond à l'ajout ci-dessous.

La partie -v string="${pastestring}" importe la variable dans le contexte bash dans le contexte de Awk car les deux sont différents.

Au cas où vous voudriez écraser le fichier avec le nouveau contenu, créer un fichier temporaire à partir de la sortie de awk et le rediriger vers le fichier d'origine (équivalent de votre sed < em> modification sur place )

awk -v string="${pastestring}" '/Branch Owner/{print; flag=1; next}$0 ~ "^[#]*$" && flag && NF{print; print string; flag=0; next}1' "$file" > temp && mv temp "$file"
1
Inian 4 avril 2017 à 09:19

Une solution Perl qui effectue un remplacement sur place et vérifie le modèle Mail:

perl -0777  -i -pne 's/(Mail:[^\n]*\n#+\n)/\1\n##### Branch FREEZE enable\/disable\nFreeze: enable\n/g' your_file

$ cat your_file
######## Branch Owner #########
Owner: Jones Jane
Mail: Jones@gmail.com
###############################

##### Branch FREEZE enable/disable
Freeze: enable

##### Branch RELEASE enable/disable
Release: disable

##### Branch configuration enable/disable
Release: enable

##### Branch output enable/disable
Release: enable
0
Juan Diego Godoy Robles 4 avril 2017 à 08:46