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