Supposons que j'ai un fichier qui contient plusieurs occurrences de StringA et StringB. Je veux remplacer toutes les occurrences de StringA par StringB et (simultanément) toutes les occurrences de StringB par StringA.
En ce moment, je fais quelque chose comme
cat file.txt | sed 's/StringB/StringC/g' | sed 's/StringA/StringB/g' | sed 's/StringC/StringA/g'
Le problème avec cette approche est qu'elle suppose que StringC ne se produit pas dans le fichier. Bien que ce ne soit pas un problème dans la pratique, cette solution semble toujours sale - c'est-à-dire qu'elle ressemble à une opportunité d'apprendre plus de magie unix. :)
sed: can't read s/StringB/StringA/g: No such file or directory
. Cela ne semble-e t PATTERN
pas bien compris.-e
avant la deuxièmes
commande. J'ai corrigé ma réponse.Je pense que votre approche est bonne, vous devez simplement utiliser quelque chose d'autre au lieu d'une chaîne, quelque chose qui ne peut pas se produire dans une ligne (dans l'espace de motif). Le meilleur candidat est la
\n
ewline.Normalement, aucune ligne d'entrée dans l'espace de motif ne contiendra ce caractère donc, pour permuter toutes les occurrences de
THIS
etTHAT
dans un fichier, vous pouvez exécuter:ou, si votre sed prend également
\n
en charge la RHS:la source
sed
supporte ou non certaines échappées devient beaucoup moins important si vous préparez quelques macros au préalable. Commeset /THIS /THAT "$(printf \\n/)"; sed "s/$2/\\$4g;s/$3$2/g;s/\\n$3/g"
- un peu stupide ici, certes, mais cela a beaucoup plus de sens à d'autres moments - en particulier pour les classes de chars et similaires.sed
, la surcharge constante de la fourche avece
est un cauchemar pour kinduva. Sur une note différente - je joue avecpaste
depuis une journée entière. J'ai fait unecolumn
sorte de parseur d'option . Il suffit de tirets pour les chaînes d'entrée et les chaînes ensemble.Je pense qu'il est parfaitement valable d'utiliser une chaîne "nonce" pour échanger deux mots. Si vous voulez une solution plus générale, vous pouvez faire quelque chose comme:
Cela donne
Notez que vous avez besoin des deux substitutions supplémentaires ici pour éviter de les remplacer
x_x
si vous avez des chaînes "x_x". Mais même cela semble encore plus simple que laawk
solution pour moi.la source
_
, il faut ajuster_
lui - même (choisir un autre caractère) ou la chaîne gênante (jouers/_/__/g
dessus à l'avance, semble mieux). Votre solution, telle qu'elle est, ne peut pas être appliquée aveuglément pour permuter des chaînes arbitraires.s/_/__/g
préalable. Peut-être juste montrer un test qui échoue._
, alors dites remplacery_ou
parme
. Oui, c'est vrai, il faut être conscient de cela et mettrey__ou
dans l'expression. Un script qui prend le remplacement comme paramètres d'entrée doit également en tenir compte.