web-dev-qa-db-fra.com

Quel est le caractère de nouvelle ligne - '\ n'

C'est un concept très basique, mais je n'ai jamais été capable de l'exprimer aussi bien. et je voudrais essayer de l'épeler et voir où je me trompe.

Si je devais le faire, comment définirais-je un "caractère de nouvelle ligne"? si je crée un nouveau fichier sous Unix (ou Windows), le fichier stocke-t-il les informations de "fin de ligne" en insérant un caractère spécial dans le fichier appelé "caractère de nouvelle ligne". Si oui, quelle est sa valeur ASCII? Je me souviens que dans les programmes C, j’ai vérifié le caractère lu par rapport à la valeur '\ n'. Et pourquoi cette confusion de 2 caractères pour représenter les caractères de fin de ligne ..

bash$ cat states
California
Massachusetts
Arizona

Dites, je veux insérer un espace de ligne entre les lignes et je veux une sortie du formulaire: Sortie souhaitée:

California

Massachusetts

Arizona

bash$sed -e 's/\n/\n\n/g' states  does not work.

Pourquoi ne puis-je pas traiter "caractère de nouvelle ligne" ici comme je traiterais n'importe quel autre caractère et exécuterais quelque chose comme la commande ci-dessus. (Je crois comprendre que l’on pourrait dire que c’est une question de syntaxe de sed, mais pourriez-vous expliquer l’intuition de ne pas permettre cela, afin que je puisse me débarrasser de ma confusion.

De même, dans l'éditeur vim, je ne peux pas utiliser:% s/\ n/\ n\n/g. Pourquoi

Dois-je m'échapper davantage\n en utilisant une barre oblique inverse dans sed et depuis vim ?.

Merci,

Jagrati

8
xyz

De la page de manuel sed :

Sed copie normalement une ligne d’entrée, sans inclure le caractère de fin de ligne, dans un espace modèle (sauf s’il reste quelque chose après une fonction "D"), applique toutes les commandes dont les adresses sélectionnent cet espace modèle, les copies l’espace modèle à la sortie standard, en ajoutant une nouvelle ligne et supprime l’espace modèle.

Il fonctionne sur la ligne sans présence de nouvelle ligne, de sorte que le modèle que vous avez là-bas ne peut jamais correspondre. Vous devez faire autre chose - comme une correspondance avec $ (fin de ligne) ou ^ (début de ligne).

Voici un exemple de quelque chose qui a fonctionné pour moi:

$ cat > states
California
Massachusetts
Arizona
$ sed -e 's/$/\
> /' states
California

Massachusetts

Arizona

J'ai tapé un caractère de nouvelle ligne après le \ dans la ligne sed.

10
Carl Norum

NewLine (\ n) vaut 10 (0xA) et CarriageReturn (\ r) vaut 13 (0xD).

Différents systèmes d'exploitation ont sélectionné différentes représentations de fin de ligne pour les fichiers. Windows utilise CRLF (\ r\n). Unix utilise LF (\ n). Les anciennes versions de Mac OS utilisent CR (\ r), mais OS X est passé au caractère Unix.

Voici un relativement utile FAQ .

11
i_am_jorf

Les caractères d'échappement dépendent du système qui les interprète. \n est interprété comme un caractère de nouvelle ligne par de nombreux langages de programmation, mais cela n'est pas nécessairement vrai pour les autres utilitaires que vous mentionnez. Même s'ils traitent \n comme une nouvelle ligne, il peut y avoir d'autres techniques pour les amener à se comporter comme vous le souhaitez. Vous devrez consulter leur documentation (ou voir d'autres réponses ici).

Pour les systèmes DOS/Windows, la nouvelle ligne est en réalité composée de deux caractères: Retour à la ligne (ASCII 13, AKA \r), suivi du saut de ligne (ASCII 10). Sur les systèmes Unix (y compris Mac OSX), il s’agit d’un saut de ligne. Sur les Mac plus anciens, il s’agissait d’un retour simple.

5
Cogwheel
sed 's/$/\n/' states
3
Johan

Je pense que this post de Jeff Attwood répond parfaitement à votre question. Il vous présente les différences entre les nouvelles lignes sur Dos, Mac et Unix, puis explique l'historique des réponses CR (retour chariot) et LF (saut de ligne).

1
Corina

sed peut être mis en mode de recherche et de remplacement sur plusieurs lignes pour correspondre aux caractères de nouvelle ligne \n.

Pour ce faire, sed doit d'abord lire l'intégralité du fichier ou de la chaîne dans le tampon de conservation ("espace réservé") afin qu'il puisse ensuite traiter le contenu du fichier ou de la chaîne comme une seule ligne dans "l'espace modèle". 

Pour remplacer une seule nouvelle ligne de manière portable (en ce qui concerne GNU et FreeBSD sed), vous pouvez utiliser une "nouvelle" ligne échappée.

# cf. http://austinmatzko.com/2008/04/26/sed-multi-line-search-and-replace/
echo 'California
Massachusetts
Arizona' | 
sed -n -e '
# if the first line copy the pattern to the hold buffer
1h
# if not the first line then append the pattern to the hold buffer
1!H
# if the last line then ...
$ {
# copy from the hold to the pattern buffer
g
# double newlines
s/\n/\
\
/g
s/$/\
/
p
}'

# output
# California
#
# Massachusetts
#
# Arizona
#

Il y a cependant un bien plus commode à atteindre le même résultat:

echo 'California
Massachusetts
Arizona' | 
   sed G
1
cahn

Essaye ça:

$ sed -e $'s/\n/\n\n/g' states
0
Adrian

Je vois beaucoup de réponses sed, mais aucune pour vim. Pour être juste, le traitement de vim des caractères de nouvelle ligne est un peu déroutant. Rechercher \n mais remplacer par \r. Je recommande RTFM: :help pattern en général et :help NL-used-for-Nul en particulier.

Pour faire ce que vous voulez avec une commande: substitute,

:%s/\_$/\r

bien que je pense que la plupart des gens utiliseraient quelque chose comme

:g/^/put=''

pour le même effet.

Voici un moyen de trouver la réponse par vous-même. Exécutez votre fichier via xxd, qui fait partie de la distribution vim standard.

:%!xxd

Vous recevez

0000000: 4361 6c69 666f 726e 6961 0a4d 6173 7361  California.Massa
0000010: 6368 7573 6574 7473 0a41 7269 7a6f 6e61  chusetts.Arizona
0000020: 0a                                       .

Cela montre que 46 est le code hexadécimal pour C, 61 est le code pour a, etc. En particulier, 0a (décimal 10) est le code pour \n. Juste pour le plaisir, essayez

:set ff=dos

avant de filtrer à travers xxd. Vous verrez 0d0a (CRLF) comme terminateur de ligne.

:help /\_$
:help :g
:help :put
:help :!
:help 23.4
0
benjifisher