2017-10-16 17 views
1

chat EV- ./test.txtLinux regex - supprimer "nouvelle ligne", mais garder "CR + nouvelle ligne"?

1 line with "carriage return \r" and "new line \n" ^M$ 
2 line only with "new line \n" $ 
3 ^M$ 
4 line with "carriage return \r" and "new line \n" ^M$ 
5 line with "carriage return \r" and "new line \n" ^M$ 
6 line only with "new line \n" $ 
7 line only with "new line \n" $ 
8 line with "carriage return \r" and "new line \n" ^M$ 

Je voudrais supprimer nouvelle ligne ombles \ n, mais seulement dans les lignes sans CR.

Donc, la production devrait être quelque chose comme ceci:

1 line with "carriage return \r" and "new line \n" ^M$ 
2 line only with "new line \n" 3 ^M$ 
4 line with "carriage return \r" and "new line \n" ^M$ 
5 line with "carriage return \r" and "new line \n" ^M$ 
6 line only with "new line \n" 7 line only with "new line \n" 8 line with "carriage return \r" and "new line \n" ^M$ 

Et après cela, il s `temps pour enlever CR. Sortie finale:

1 line with "carriage return \r" and "new line \n" $ 
2 line only with "new line \n" 3 $ 
4 line with "carriage return \r" and "new line \n" $ 
5 line with "carriage return \r" and "new line \n" $ 
6 line only with "new line \n" 7 line only with "new line \n" 8 line with "carriage return \r" and "new line \n" $ 

Le dernier point est facile, par exemple dans vim: % de @ \ r @@ le gc ... il y a beaucoup de conseils sur Internet "comment supprimer CR".

Mais mon problème est avec beginng - comment supprimer "\ n" dans perl et/ou sed, mais seulement avec des lignes sans CR?

Répondre

2

Vous pouvez faire les deux étapes à la fois en Perl:

perl -pe 's/(?<!\r)\n//; s/\r$//' 

(. Retirer newline sinon précédée par un retour chariot, enlever retour chariot à la fin de la ligne)

Autre possibilité:

perl -pe 'chomp; s/\r\z/\n/' 

(Suppression de la nouvelle ligne de fin, remplacez le retour chariot final par newline.)

La première version peut également être adaptée à vim:

:%s/\r\@<!\n 
:%s/\r$ 

(Disclaimer: Je n'ai pas testé.)

+0

Notez que cela ne fonctionnera pas sur Windows. – ikegami

+1

@ikegami OP a dit "Linux regex". :-) – melpomene

+0

Je ne suggérais pas que quelque chose devrait être changé. – ikegami

2

Une solution avec GNU awk (en utilisant le séparateur d'enregistrement):

awk 'BEGIN{RS=ORS="\r\n"}{gsub(/\n/,"")}1' test.txt 
+1

Vous devriez mentionner que GNU awk est seulement pour RS multi-char. –