1
votes

supprimer le caractère sur la dernière ligne où le mot spécifique apparaît

nous avons l'exemple de fichier suivant

nous voulons supprimer le caractère , sur la dernière ligne où le mot topic existe

sed -i '${s/,[[:blank:]]*$//}' file


1 commentaires

Il semble que les lettres majuscules soient brisées sur votre clavier ou votre téléphone.


3 Réponses :


2
votes

Vous devez utiliser l'adresse $ (dernière ligne):

sed '$s/,$//' file


1 commentaires

Je l'ai testé, mais il n'a pas supprimé le ","



0
votes

Utilisation de awk:

...
{"topic":"life_is_hard","partition":98,"replicas":[1002,1001]},
{"topic":"life_is_hard","partition":99,"replicas":[1003,1002]}

Sortie:

$ awk '{if(NR>1)print p;p=$0}END{sub(/,$/,"",p);print p}' file


2 commentaires

Je l'ai testé, mais il n'a pas supprimé le ","


Probablement les fins de ligne Windows ( \ r \ n par opposition à \ n utilisé par exemple dans Linux) alors. Vous pouvez: awk '{if (NR> 1) print p; p = $ 0} END {sub (/, \ r $ /, "\ r", p); print p}' file c'est à dire. remplacez , \ r par \ r .



2
votes

Si vous avez des caractères de contrôle M dans votre fichier d'entrée, supprimez-les en faisant:

tac Input_file | 
awk '/topic/ && ++count==1{sub(/,$/,"")} 1' | 
tac


Pourriez-vous s'il vous plaît essayer de suivre une fois. D'après votre question, ce que j'ai compris, c'est que vous voulez supprimer la virgule de la toute dernière ligne contenant la chaîne topic , si tel est le cas, je propose tac + awk solution ici.

tr -d '\r' < Input_file > temp && mv temp Input_file

Une fois que vous êtes satisfait des résultats ci-dessus, ajoutez > temp && mv temp Input_file ci-dessus commande aussi, pour enregistrer la sortie dans Input_file lui-même.

Explication:

Un tac lisez Input_file de la ligne du bas à la première ligne, puis passez sa sortie à awk où je vérifie si la première occurrence du sujet arrive, supprimez la virgule de la dernière et du reste des lignes, imprimez simplement, puis passez à nouveau cette sortie à tac pour rendre à nouveau Input_file sous sa forme originale.


4 commentaires

Je pense que OP a des fins de ligne \ r \ n et je n'ai aucune idée de la version awk.


Vous avez le même problème que moi, considérez , \ r -> \ r . Votre solution a fonctionné avec cela.


tr -d '\ r' temp && mv temp fichier_entrée ??


@ DavidC.Rankin, ahh merci, vous GEM pour ma défense il était 4 heures du matin :) :) Je l'ai corrigé maintenant. Merci de me le faire savoir.