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 fort>: p> Je sais que je peux est-ce possible de combiner cela. Donc si Mise à jour avec Un meilleur exemple d'entrée / sortie: strong> p> par exemple, si j'avais ce fichier d'entrée Disons que je voulais trouver et remplacer ceci est parce que Disons que je voulais trouver et remplacer ceci est parce que / ^ recherche. * $ / Code> correspondez ensuite, s'il ne le remplace pas, puis appendez le remplacement à la fin du fichier. P>
testfile code>: p>
bravo code> avec
bravo = bingo code>, ou strong> ajouter
bravo = bingo code> si < code> bravo code> n'est pas là, la sortie attendue est la suivante: p>
bravo code> existe dans le fichier. remplacé. P>
delta code> avec
delta = bingo code>, ou strong> Ajouter
Delta = Bingo code> si
delta code> n'est pas là, la sortie attendue est la suivante: p>
delta code> n'est pas dans le fichier, donc il est annexé. p> p>
4 Réponses :
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
Cette dernière ligne SED traiterait $ aline code> 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é.
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
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)
awk one-liner: ceci ne remplace pas en place, si vous voulez un changement en place: p> N'oubliez pas d'échapper à l'orginal et à remplacer s'ils contiennent des caractères code> regex code>, il est plus facile que de modifier la méthode de correspondance / substration lorsque les textes ne sont pas longs. P> P>
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 code> 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.
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
Je ne suis pas coincé sur
sed code>. N'est-il pas / SE sur le meilleur i> 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 b> 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 =. * $ Code> mais cela ne correspond pas à votre exemple "Bravo". Vous dites que vous souhaitez appendez
delta = bingo code> mais vous appendez réellement
delta code>.
@jhnc oups. Désolé pour les fautes de frappe. J'ai réparé.