1 votes

Comment remplacer une ligne par 3 lignes / ajouter 2 avant trouvé / ajouter 2 avant 1 de la fin

Le fichier est :

#Welcome to the file
#this is a file and it ends on "exit 0"
#Here are unknown number of lines
exit 0

Il faut que ces lignes se suivent :

echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch

Donc ça ressemble à ça :

#Welcome to the file
#this is a file and it ends on "exit 0"
#Here are unknown number of lines
echo deadline > /sys/block/sda/queue/scheduler
echo 1 > /sys/block/sda/queue/iosched/fifo_batch
exit 0

PROBLÈMES- commande dans commande dans commande dans commande avec beaucoup de lignes \n

Pour l'instant, j'ai commandé sed -i 's/exit 0/echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch\nexit 0/gp' /usr/file mais il y a quelque chose qui cloche - ça ne marche pas.

Mise à jour 1

"SLASHES" / a \/ : J'ai trouvé la solution pour les slashs à utiliser \/ et les antislashes \\ .

Donc maintenant ma commande fonctionne sed -i 's/exit 0/echo deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file

Mais il doit être modifié parce que maintenant il trouve toutes les expressions mais comment juste qu'il trouve une ligne n'ayant rien d'autre dedans ? Donc il ne remplace pas ce qui est dans exit 0 dans le commentaire des fichiers d'exemple.

Mise à jour 2

Au moins une ligne commençant par ^ : Trouvé pour faire la solution pour ce fichier sed 's/^exit 0/\necho deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file mais dans le cas où le fichier texte a des lignes :

exit 0
exit 0 means exiting

Alors on ne peut pas utiliser ^ pour trouver la ligne commençant par l'expression.

La meilleure solution serait donc celle que je ne trouve pas : comment trouver la ligne exacte contenant juste une expression ou trouver la ligne d'expression et pas toutes les expressions ?

Mise à jour 3

Ligne exacte ^ & $ : S'éteindre ^ les limites ne doivent pas être sur le côté gauche et $ rien ne doit être sur le côté droit donc maintenant la solution de travail pour 1. la solution est sed -i 's/^exit 0$/\necho deadline > \/sys\/block\/sda\/queue\/scheduler\necho 1 > \/sys\/block\/sda\/queue\/iosched\/fifo_batch\nexit 0/' /usr/file

Je veux apprendre au moins 3 façons d'utiliser des commandes en 1 ligne. Comment faire :

  1. remplacer la ligne trouvée par 3 lignes avec le symbole contenant la commande comme mentionné
  2. trouvé la ligne complète et pas seulement l'expression et ajouté 2 lignes avant trouvé
  3. ajouter 2 lignes 1 ligne avant la fin

0 votes

Je ne sais pas vraiment ce que vous demandez. Pouvez-vous nous montrer un exemple de ce à quoi pourraient ressembler un fichier initial et un fichier final ?

0 votes

Veuillez poser plusieurs questions indépendamment, en tant que questions distinctes.

0 votes

Veuillez formuler votre question précisément . La signification de "remplacer la ligne trouvée par 3 lignes avec des symboles" n'est pas claire, car on s'attend à ce que "remplacer" n'ait qu'un seul "avec" correspondant après lui, comme "remplacer A par B".

4voto

potong Points 41

Celles-ci pourraient vous convenir (elles ont toutes le même objectif !):

 sed '/^exit 0/i\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch' file

Recherche du début de la ligne exit 0 et insérer 2 lignes.

Ou :

 sed '$i\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch' file

Insérer 2 lignes avant la dernière ligne du fichier.

Ou :

 sed '$c\echo deadline > /sys/block/sda/queue/scheduler\necho 1 > /sys/block/sda/queue/iosched/fifo_batch\nexit 0' file

Changer la dernière ligne du fichier en 3 lignes.

0voto

Prateek Points 2491

Pour la question 3 : Je suppose que vous voulez ajouter du texte entre la dernière et l'avant-dernière ligne d'un fichier. De plus, ce texte est composé de 2 lignes, mais cela n'a pas d'importance. head -n -1 extraira tout sauf la dernière ligne, et tail -n 1 extraira la dernière ligne. On peut donc faire

head -n -1 file > outputfile
cat file_with_two_line_text >> outputfile
tail -n 1 file >> outputfile

Cette méthode n'est pas très efficace car elle analyse deux fois le "fichier", alors qu'il suffit de l'analyser une seule fois.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X