GNU/Linux >> Tutoriels Linux >  >> Linux

Comment utiliser Sed pour remplacer une chaîne multiligne ?

J'ai remarqué que, si j'ajoute n à un modèle pour remplacer en utilisant sed , ça ne correspond pas. Exemple :

$ cat > alpha.txt
This is
a test
Please do not
be alarmed

$ sed -i'.original' 's/a testnPlease do not/not a testnBe/' alpha.txt

$ diff alpha.txt{,.original}

$ # No differences printed out

Comment puis-je faire fonctionner cela ?

Réponse acceptée :

Dans l'appel le plus simple de sed , il en a un ligne de texte dans l'espace du motif, c'est-à-dire. 1 ligne de n texte délimité de l'entrée. La ligne unique dans l'espace de motif n'a pas de n … C'est pourquoi votre regex ne trouve rien.

Vous pouvez lire plusieurs lignes dans l'espace de motif et manipuler les choses étonnamment bien, mais avec un effort plus que normal. Sed a un ensemble de commandes qui permettent ce type de chose... Voici un lien vers un résumé des commandes pour sed. C'est le meilleur que j'ai trouvé et ça m'a fait rouler.

Cependant, oubliez l'idée "one-liner" une fois que vous commencez à utiliser les micro-commandes de sed. Il est utile de le présenter comme un programme structuré jusqu'à ce que vous en ayez la sensation… C'est étonnamment simple, et tout aussi inhabituel. Vous pourriez le considérer comme le "langage assembleur" de l'édition de texte.

Résumé :Utilisez sed pour des choses simples, et peut-être un peu plus, mais en général, quand il s'agit de travailler avec une seule ligne, la plupart des gens préfèrent autre chose...
Je laisserai quelqu'un d'autre suggérer autre chose... Je Je ne sais vraiment pas quel serait le meilleur choix (j'utiliserais sed, mais c'est parce que je ne connais pas assez perl.)

sed '/^a test$/{
       $!{ N        # append the next line when not on the last line
         s/^a testnPlease do not$/not a testnBe/
                    # now test for a successful substitution, otherwise
                    #+  unpaired "a test" lines would be mis-handled
         t sub-yes  # branch_on_substitute (goto label :sub-yes)
         :sub-not   # a label (not essential; here to self document)
                    # if no substituion, print only the first line
         P          # pattern_first_line_print
         D          # pattern_ltrunc(line+nl)_top/cycle
         :sub-yes   # a label (the goto target of the 't' branch)
                    # fall through to final auto-pattern_print (2 lines)
       }    
     }' alpha.txt  

Ici, c'est le même script, condensé dans ce qui est évidemment plus difficile à lire et à utiliser, mais certains appelleraient avec doute un one-liner

sed '/^a test$/{$!{N;s/^a testnPlease do not$/not a testnBe/;ty;P;D;:y}}' alpha.txt

Voici ma commande "cheat-sheet"

:  # label
=  # line_number
a  # append_text_to_stdout_after_flush
b  # branch_unconditional             
c  # range_change                     
d  # pattern_delete_top/cycle          
D  # pattern_ltrunc(line+nl)_top/cycle 
g  # pattern=hold                      
G  # pattern+=nl+hold                  
h  # hold=pattern                      
H  # hold+=nl+pattern                  
i  # insert_text_to_stdout_now         
l  # pattern_list                       
n  # pattern_flush=nextline_continue   
N  # pattern+=nl+nextline              
p  # pattern_print                     
P  # pattern_first_line_print          
q  # flush_quit                        
r  # append_file_to_stdout_after_flush 
s  # substitute                                          
t  # branch_on_substitute              
w  # append_pattern_to_file_now         
x  # swap_pattern_and_hold             
y  # transform_chars                   

Linux
  1. Comment remplacer une chaîne par une chaîne contenant une barre oblique avec Sed ?

  2. Utiliser grep et sed pour rechercher et remplacer une chaîne

  3. Comment remplacer une chaîne dans plusieurs fichiers en ligne de commande Linux

  4. Comment utiliser sed pour extraire la sous-chaîne

  5. Comment utiliser sed pour remplacer la variable d'un fichier de configuration ?

Comment utiliser les fonctions de chaîne MySQL

Comment utiliser sed pour rechercher et remplacer une chaîne dans des fichiers

Comment utiliser la commande SED pour rechercher et remplacer une chaîne dans des fichiers

COMMENT UTILISER L'EDITEUR SED

Top 20 des commandes sed à utiliser

Comment utiliser Sed pour rechercher et remplacer une chaîne dans un fichier