c'est la première fois que je poste ici, alors je m'excuse si le formatage est tout à fait bizarre.
En utilisant la commande sed, je veux permuter x et y, de x, y en y, x et stocker la version permutée dans un fichier séparé.
Le fichier que je suis censé modifier contient,
#######bank info######## # ####name#### ####age#### # Bob,Stevenson 27 David,Tan 43 Robert,Jackson 39
Je veux changer le nom de prénom, nom en nom, prénom.
J'ai déjà essayé d'utiliser la commande,
#######bank info######## # ####name#### ####age#### # Stevenson,Bob 27 Tan,David 43 Jackson,Robert 39
Pourtant, quand j'examine le fichier "swappé", il semble que rien n'a changé. Pourquoi?
Le résultat attendu est:
sed -e "s/^\([^#]*\) *\([,]*\)/\2\1/g" file > xxx
Mais mon résultat est:
#######bank info######## # ####name#### ####age#### # Bob,Stevenson 27 David,Tan 43 Robert,Jackson 39
Lequel est exactement la même que la version initiale. Pourquoi cela se produit-il?
3 Réponses :
sed '/^#/!s/^\([^,]*\),\([^ ]*\)/\2,\1/'
Merci beaucoup! Je vois ce que j'ai fait de mal. Je pensais que ([^ #] *) signifiait correspondre à tout le reste, sauf ceux qui commencent par # car utiliser ^ dans un caractère générique ne signifiait pas ce qu'il suit.
Bien sûr, mais aussi le [^ #] * correspondra à tout jusqu'à ce que le # , mais le * correspond à zéro ou plusieurs caractères. Il peut donc correspondre à zéro caractères en fait. Je pense que vous pouvez également s / ^ \ ([^ #,] \ + \), \ ([^] * \) / \ 2, \ 1 / , mais je me sentais comme / ^ # /! est plus explicite que nous voulons ignorer les commentaires. Parce que c'est plus facile ex. à / ^ [\ t] * # /! pour ignorer également les commentaires qui sur les lignes commençant par un espace ou des tabulations suivis de # .
Même approche que la très bonne réponse de @KamilCuk, mais en utilisant des expressions régulières et des mots, vous pouvez faire
$ sed -E '/,/s/(\w+),(\w+)/\2,\1/' file #######bank info######## # ####name#### ####age#### # Stevenson,Bob 27 Tan,David 43 Jackson,Robert 39
Où /, / ne fonctionne que sur les lignes avec un ',' et les groupes de capture de (\ w +) correspondent à des groupes d'un ou plusieurs mots-caractères. L'expression (\ w +), (\ w +) garantit qu'il y a deux groupes de mots-caractères séparés par une virgule, puis le \ 2, \ 1 réinsère simplement le références arrière dans l'ordre inverse, par exemple
Exemple d'utilisation / sortie
sed -E '/,/s/(\w+),(\w+)/\2,\1/' file > newfile
Ahhh cela a tellement de sens! Je n'ai pas encore entendu parler de (\ w +), donc c'est très utile. Merci beaucoup!
Oui, et toutes les subtilités des expressions régulières étendues aident à résoudre très bien certains des problèmes liés aux mots et aux limites de mots - mais les expressions régulières étendues ne sont pas disponibles pour tous les sed , il vaut donc mieux le savoir comment utiliser les deux :)
Si vous pouvez utiliser awk , cela fera l'affaire.
awk -F'[ ,]+' '/,/{$0=$2","$1"\t"$3}1' file
#######bank info########
#
####name#### ####age####
#
Stevenson,Bob 27
Tan,David 43
Jackson,Robert 39
Il peut être plus facile de comprendre le awk par rapport à sed :)
-F '[] +' Diviser la ligne par une ou plusieurs virgules ou espaces /, / pour les lignes avec virgule faire: $ 0 = $ 2 "," $ 1 "\ t" $ 3 reconstruire la ligne dans un nouvel ordre avec une virgule et une tabulation 1 toujours vrai, effectuez l'action par défaut, imprimez la ligne.
Est-ce que cela répond à votre question? permuter les colonnes à l'aide de sed
@oguz ismail Merci pour la réponse! Je ne sais pas comment fonctionne le code qu'ils ont fourni. sed 's / ([^:] *:) ([^] *) ([^:] *) / \ 1 \ 3 \ 2 /' test. Pourquoi ont-ils 3 de ((...))?