0
votes

trouver et remplacer une ligne ou ajouter à la fin du fichier

est-il possible de trouver et de remplacer une ligne dans un fichier ou d'ajouter une chaîne à la fin si ce n'est pas là?

Je sais que je peux utiliser ceci pour trouver trouver et remplacer : xxx

Je sais que je peux ajouter au fichier comme celui-ci: xxx

est-ce possible de combiner cela. Donc si / ^ recherche. * $ / correspondez ensuite, s'il ne le remplace pas, puis appendez le remplacement à la fin du fichier.

Mise à jour avec Un meilleur exemple d'entrée / sortie:

par exemple, si j'avais ce fichier d'entrée testfile : xxx

Disons que je voulais trouver et remplacer bravo avec bravo = bingo , ou ajouter bravo = bingo si bravo n'est pas là, la sortie attendue est la suivante: xxx

ceci est parce que bravo existe dans le fichier. remplacé.

Disons que je voulais trouver et remplacer delta avec delta = bingo , ou Ajouter Delta = Bingo si delta n'est pas là, la sortie attendue est la suivante: xxx

ceci est parce que delta n'est pas dans le fichier, donc il est annexé.


4 commentaires

Je ne suis pas coincé sur sed . N'est-il pas / SE sur le meilleur moyen de faire quelque chose? La façon dont vous avez montré des œuvres, et c'est particulièrement utile pour insérer quelque chose avec plusieurs lignes, mais dis-tu son meilleur moyen de le faire si vous n'avez pas besoin d'insérer plusieurs lignes? Si vous êtes alors je serai bien sûr. La raison pour laquelle je souhaite ré-ouvrir la question est de savoir s'il existe une meilleure façon de le faire lorsque vous n'avez pas besoin d'insérer quelque chose avec plusieurs lignes.


Oui, c'est exactement ce que je dis car il est clair, simple, portable, efficace, robuste et facile à améliorer. IDK Que signifie BTW et ne pouvait pas trouver de définition pour cela par Googling.


Votre texte explicatif ne correspond pas à vos sorties d'échantillons. Vous dites que vous voulez remplacer ^ recherche =. * $ mais cela ne correspond pas à votre exemple "Bravo". Vous dites que vous souhaitez appendez delta = bingo mais vous appendez réellement delta .


@jhnc oups. Désolé pour les fautes de frappe. J'ai réparé.


4 Réponses :


0
votes

Je ne connais pas une seule commande code> SED code>, mais vous pouvez simplement avoir sed code> sauvegarder le fichier, puis testez la différence. S'il n'y a pas de différence, appendez-vous à la fin du fichier:

sed -i.bak -e 's/^SEARCH/LINE 1\nLINE 2/' file
diff file file.bak > /dev/null
if [ $? -eq 0 ]; then
    sed -i -e '$aLINE 1\nLINE 2' file
fi


2 commentaires

Cette dernière ligne SED traiterait $ aline en tant que variable de coquille qui se développe à NULL. Utilisez toujours des guillemets simples autour des chaînes et des scripts, sauf si vous avez un besoin très spécifique d'utiliser des guillemets doubles (par exemple pour exposer le script / la chaîne à la coque pour une expansion variable) et bien comprendre les implications et les conséquences. Il a échoué de différentes manières données à diverses valeurs de recherche et de chaque ligne, et appeler plusieurs outils sur le fichier est évidemment une approche très inefficace (par exemple, pourquoi le premier SED + DIFF au lieu d'un seul grep pour la recherche?).


Merci, @edmorton. Corrigé.



0
votes

GNU SED One-Liner:

sed -i 's/^SEARCH/LINE 1\nLINE 2/;ts;bt;:s;h;:t;${x;/./!{x;s/$/\nLINE 1\nLINE 2/;be};x};:e' file


2 commentaires

Cela vous dérangerait-il d'expliquer ce que tout ça fait? Je ne suis pas capable de suivre / comprendre.


@Imthenachman Pourriez-vous trouver et lire le doc, essayez de le comprendre vous-même? Si vous avez alors une question, vous pouvez demander à nouveau. (T / B sont des gotos et: s /: t /: e sont des ancres)



1
votes

awk one-liner: xxx

ceci ne remplace pas en place, si vous voulez un changement en place: xxx

N'oubliez pas d'échapper à l'orginal et à remplacer s'ils contiennent des caractères regex , il est plus facile que de modifier la méthode de correspondance / substration lorsque les textes ne sont pas longs.


6 commentaires

Cela essa-t-il donc essentiellement de faire le remplacement, et s'il fonctionne, il définit une variable, et si vous n'imprimez pas, il n'imprimera pas cette ligne à la fin?


@Imthenachman droit.


@Imthenachman, peu importe les travaux de remplacement ou non, les lignes seront imprimées. Le S var est pour déterminer l'annexe enfin ou non.


Cela échouera étant donné divers caractères possibles dans les textes d'origine et de remplacement. Ce problème doit être résolu avec les opérations de chaîne, non pas de texte activé à la réégalité et à la référence arrière.


@Imthenachman Vérifiez ce que l'Ed a mentionné, si vous avez de tels scénarios, faites attention et n'oubliez pas de vous échapper (plus facile que de changer de correspondance et de substrateur, etc. Si le texte n'est pas grand).


@Edmorton Merci de la mentionner.



2
votes

La partie de rechange est exactement la même que chez https://stackoverflow.com/a/54504046/1745001 mais Ici, il est simplifié pour ce boîtier d'utilisation spécifique et la modification de l'APPENDUMÉ SI NONT FAIT est faite simplement en définissant un drapeau s'il est trouvé et imprimé à la fin si ce drapeau n'est pas défini:

awk 'BEGIN{new="LINE 1\nLINE 2"} /^SEARCH/{$0=new; f=1} {print} END{if (!f) print new}' file


0 commentaires