2009-10-24 3 views
11

J'ai modèle comme ci-dessousComment remplacer les nouvelles lignes par des tabulations?

hi 
hello 
hallo 
greetings 
salutations 
no more hello for you 

Je suis en train de remplacer tous les sauts de ligne avec onglet à l'aide de la commande suivante

sed -e "s_/\n_/\t_g" 

mais il ne fonctionne pas.

Quelqu'un pourrait-il m'aider? Je suis à la recherche d'une solution dans sed/awk.

Répondre

11

pas sûr de sortie que vous voulez

# awk -vRS="\n" -vORS="\t" '1' file 
hi  hello hallo greetings  salutations  no more hello for you 
32

Ici tr est mieux, je pense:

tr "\n" "\t" < newlines 

Comme Nifle suggéré dans un commentaire, newlines est ici le nom du fichier contenant le texte original.

Parce que sed est tellement orienté ligne, il est plus compliqué à utiliser dans un cas comme celui-ci.

+1

+1 Me battre de 40 secondes – Nifle

+0

@Nifle: Aussi pas de 'cat' ici, mais qui compte? :) – Telemachus

+0

Pourrait faire remarquer que 'newlines' est le fichier texte – Nifle

5

Vous ne pouvez pas remplacer les nouvelles lignes sur une base ligne par ligne avec sed. Vous devez accumuler des lignes et remplacer les nouvelles lignes entre eux.

text abc\n <- can't replace this one 

text abc\ntext def\n <- you can replace the one after "abc" but not the one at the end 

Ce script sed accumule toutes les lignes et supprime tous les sauts de ligne, mais la dernière:

sed -n '1{x;d};${H;x;s/\n/\t/g;p};{H}' 

Par ailleurs, votre sed scénario sed -e "s_/\n_/\t_g" essaie de dire « remplacer toutes les barres obliques suivies de nouvelles lignes avec barres obliques suivies d'onglets ". Les traits de soulignement jouent le rôle de délimiteurs pour la commande s afin que les barres obliques puissent être plus facilement utilisées comme caractères pour la recherche et le remplacement.

6
sed '$!{:a;N;s/\n/\t/;ta}' file 
+1

pourriez-vous s'il vous plaît également expliquer sur la commande que vous utilisez? – Vijay

+0

si ce n'est pas la dernière ligne, obtenez la ligne suivante rejoindre avec l'espace de motif, remplacez la nouvelle ligne, puis branchez sur: a et faites la même chose pour chaque ligne – ghostdog74

1
paste -s 

-s concaténer toutes les lignes de chaque fichier d'entrée séparés dans l'ordre de ligne de commande . Le caractère de nouvelle ligne de chaque ligne sauf la dernière ligne dans chaque fichier d'entrée est remplacé par le caractère de tabulation , sauf indication contraire par l'option -d.

0

Vous y êtes presque avec votre script sed, vous auriez juste besoin de changer pour:

sed -e "s/\n/\t/g" 

Le \ est suffisant pour échapper, vous n'avez pas besoin d'ajouter _ Et vous devez ajouter le / avant g à la fin pour laisser sed savoir que c'est la dernière partie du script.

Questions connexes