dernière modification : 2023

ed

C’est le premier éditeur de ligne de texte. Il ne possède qu’un mode commande 😂, ce qui peut faire sourire au temps de vscode. Pourtant, cette antiquité procure encore aujourd’hui des avantages à celui qui la maitrise.

ed

Une commande ed est une ligne de la forme :

 [étendue] commande [arguments...]

1. Principales commandes

  • ajouter des lignes : a (passage en mode append, pour ajouter des lignes après la ligne courante) ou i (passage en mode insert pour ajouter des lignes avant la ligne courante), on sort de ce mode par un .

  • afficher : p (print, affiche la ligne courante), n (affiche la ligne courante avec son n°) et = (affiche le n° de la ligne courante)

  • modifier : c (change) et s (substitute)

  • effacer : d (delete)

auxquelles s’ajoutent d’autres opérations indispensables :

  • sauvegarder : w (write) ou w fichier

  • lire un fichier et l’insérer : r fichier (read)

  • quitter : q

2. Déplacement de la ligne courante

  • n : la ligne n° n devient la ligne courante

  • -1 : la ligne précédente devient la ligne courante

  • +1 : la ligne suivante devient la ligne courante

  • P : mode prompt on/off (bascule)

Exemple :

$ ed /etc/services
p                    # affiche la ligne courante
.=                    # affiche le n° de la ligne courante
s/tcp/****/          # substitue la première occurence de 'tcp' en '****' sur la ligne courante
p                    # affiche la ligne courante
a                    # entrée dans le mode append
un
deux
trois
.                    # sortie du mode append
w /tmp/services      # sauvegarde (write)
q                    # quitte

3. L’étendue

La commande peut être précédée d’une étendue, qui précise sur quelles lignes on applique la commande qui suit (par défaut, elle est appliquée sur la ligne courante seulement) :

n            # la ligne n
.            # ligne courante
+n           # n lignes après la courante
-n           # n lignes avant la courante
$            # la dernière ligne
n,m          # les lignes de n à m
-n,+m
1,$          # toutes les lignes
.,+3         # 3 lignes à partir de la courante

/regex/            # première ligne s'identifiant à la regex (à partir de la courante vers la fin)
?regex?            # première ligne s'identifiant à la regex (à partir de la courante vers le début)
/regex1/,/regex2/  # de la ligne s'identifiant à regex1 à la ligne s'identifiant à regex2

g/regex/           # groupe les lignes s'identifiant à la regex

Exemple :

$ ed /etc/services
i                    # entrée en mode insert
Première ligne
Deuxième ligne
.                          # fin du mode insert
1,.p                       # les premières lignes jusqu'à la courante
w /tmp/simple.txt          # sauvegarde
20,30w /tmp/extrait.txt    # sauvegarde partielle
1a                         # append
Après la première
.                          # fin append
1,10p
1i
Encore avant la première
.
1,10p
w

$=                   # n° de la dernière ligne
10r /etc/passwd      # lecture du fichier /etc/passwd et ajout à la ligne 10
$=                   # adresse  de la dernière ligne
1,20p
11,15d               # suppression des lignes 11 à 15
$=                   # adresse  de la dernière ligne

15,$d                # suppression des lignes de la 15ème à la fin
$=                   # adresse  de la dernière ligne

1s/e/E/p             # ligne 1, remplace le premier 'e' par 'E', et écrit le résultat
u                    # annule (undo)
1s/e/E/gp            # ligne 1, remplace tous les 'e' par 'E' (g: global)
1,$s/ /+/           # remplace le premier espace par un + sur chaque ligne
1,$p

4. Presse-papier

  • y : copie des lignes dans le presse-papier de ed

  • d : coupe des lignes et la met dans le presse-papier de ed

  • x : colle le presse-papier de ed

5. Focus sur la commande substitute

C’est la commande la plus intéressante, qui justifie qu’on peut encore avec besoin de ed aujourd’hui.

s/avant/après/        # 1ère occurrence sur la ligne courante
1,$s/avant/après/     # 1ère occurrence sur toutes les lignes
s/avant/après/g       # toutes les occurrences sur la ligne courante
1,$s/avant/après/g    # toutes les occurrences sur toutes les lignes