hg bookmarks --delete
peut être utilisé pour supprimer un signet.
Est-il possible de supprimer tous les signets d'un dépôt Mercurial via un script bash? Je pense que cela peut être possible en utilisant awk - mais cela me dépasse un peu.
Le format de la sortie hg bookmarks
est (par exemple):
2018.02.706 Customer App 2018.02.707 Customer App
Je dois juste obtenir:
2018.02.706 Customer App 5255:c1321f7f3903 2018.02.707 Customer App 5255:c1321f7f3902
6 Réponses :
Cela devrait supprimer le dernier champ:
awk '{$NF=""}1' file
Cela ne fait que définir le dernier champ sur rien:
awk 'NF{NF--}1' file
ou awk 'NF--' fichier
@Cyrus Ne peut pas être utilisé, avec une ligne vide, vous obtenez ce message awk: cmd. ligne: 1: (FILENAME = t FNR = 4) fatal: NF mis à une valeur négative
. C'est pourquoi vous devez définir le dernier champ sur vide ou tester si NF est vrai > 0
puis soustraire 1
Oui, dans ce cas, ce serait un problème. Merci de l'avoir signalé.
Ce premier ( NF--
) repose sur un comportement indéfini, donc ce qu'il fait variera d'une version awk à l'autre.
awk 'sub($NF,"")' file 2018.02.706 Customer App 2018.02.707 Customer App
Pour être complet, voici le script que j'ai utilisé pour supprimer les signets hg (il supprime également les espaces de début et de fin): hg bookmarks | awk 'NF' | awk 'sous ($ NF, "")' | awk '{gsub (/ ^ [\ t] + | [\ t] + $ /, ""); imprimer} '| awk '{print "hg bookmarks --delete \ x27" $ 0 "\ x27"}'> clear-bookmarks.sh
@dubs Je dirais, postez ça comme une nouvelle réponse, c'est plus complet que les autres.
Cela échouerait si $ NF
contenait des métachars RE. Évitez d'utiliser des données d'entrée dans des expressions régulières ou du texte de remplacement, sauf si nécessaire pour effectuer une tâche spécifique qui le nécessite. $ NF = ""
ou sub (/ [^ [: space:]] + $ /, "")
ferait la même chose de manière plus robuste mais ceux-ci partiraient toujours des blancs à la fin de chaque ligne, comme le fait votre solution actuelle.
En tenant compte de l'assistance des réponses précédentes, voici le script complet que j'ai utilisé pour supprimer les signets mercurial:
hg bookmarks | awk 'NF' | awk 'sub($NF,"")' | awk '{ gsub(/^[ \t]+|[ \t]+$/, ""); print }' | awk '{print "hg bookmarks --delete \047" $0 "\047"}' > clear-bookmarks.sh
Utilisez ce qui suit si vous voulez vous assurer que les espaces de début et de fin sont supprimés :
hg bookmarks | awk 'NF' | awk 'sub($NF,"")' | awk '{print "hg bookmarks --delete \047" $0 "\047"}' > clear-bookmarks.sh
Mon expérience de script n'est en aucun cas merveilleuse - mais elle semble faire le travail!
Vous n'avez pas besoin de plusieurs tubes et appels à awk pour faire ce que ces lignes de code feront, elles échoueront étant donné certaines valeurs de $ NF
, et vous devriez utiliser octal au lieu de hex pour obtenir le '
s, voir awk.freeshell.org/PrintASingleQuote .
@EdMorton Je ne sais pas comment réduire le nombre de tuyaux. Pour moi, c'est clair, mais j'apprécierais une amélioration suggérée à ma version?
awk 'NF' | awk 'sous ($ NF, "")' | awk '{gsub (/ ^ [\ t] + | [\ t] + $ /, ""); imprimer} '| awk '{print "hg bookmarks --delete \ 047" $ 0 "\ 047"}'
équivaut à une seule commande awk awk 'NF && sub ($ NF, "") {gsub (/ ^ [\ t] + | [\ t] + $ /, ""); print "hg bookmarks --delete \ 047" $ 0 "\ 047"} '
mais cela reste fragile, long et inutilement compliqué. Utilisez simplement l'un des scripts que j'ai publiés sur stackoverflow.com/a/56906355/1745001 .
En supposant que les espaces dans votre entrée sont des caractères vides tels qu'ils apparaissent dans votre exemple d'entrée, pour faire ce que vous avez demandé dans votre question de manière portable et robuste est:
$ awk '{sub(/ [^ ]+$/,"")}1' file 2018.02.706 Customer App 2018.02.707 Customer App $ awk '{sub(/ [^ ]+$/,""); print "hg bookmarks --delete \047" $0 "\047"}' file hg bookmarks --delete '2018.02.706 Customer App' hg bookmarks --delete '2018.02.707 Customer App'
et pour obtenir la sortie la ligne de commande dans votre réponse produirait est:
$ sed 's/\(.*\) .*$/hg bookmarks --delete '\''\1'\''/' file hg bookmarks --delete '2018.02.706 Customer App' hg bookmarks --delete '2018.02.707 Customer App'
Si vous ressentez un désir ardent d'utiliser awk alors ce serait:
$ sed 's/ [^ ]*$//' file 2018.02.706 Customer App 2018.02.707 Customer App
Remplacez / [^] + $ /
par / [ [: space:]] + [^ [: space:]] + $ /
si l'espace blanc dans votre exemple peut être autre chose qu'un simple caractère vide.
Je pense que cette solution (avec quelques corrections possibles nécessaires) sera plus simple et plus naturel, que awk-ing: pur Mercurial, rien de plus
Bonne suggestion. Cependant, cela devient délicat avec des espaces dans le nom et ne tient pas compte non plus du fait qu'un ensemble de modifications peut avoir plusieurs signets par rapport à lui, ce qui cause encore plus de difficultés à l'analyse car le -T '{signets} \ n' rapportera (potentiellement ) plusieurs signets par ligne.
Si vous voulez vraiment supprimer tous les signets, supprimez simplement le fichier .hg / bookmarks
du répertoire caché .hg
de votre dépôt.
Les signets peuvent revenir si vous les récupérez depuis un emplacement distant, vous devrez donc également faire hg book push -B 'votre nom de signet'
pour supprimer également le signet de la télécommande emplacement, mais c'est un problème auquel vous seriez confronté avec toute autre méthode de suppression de favoris.