J'ai un fichier texte avec les données suivantes et chaque ligne se termine par |END|
.
T|somthing|something|END|T|something2|something2|END|
J'essaie de remplacer |END|
par une \n
nouvelle ligne avec sed.
sed 's/\|END\|/\n/g' test.txt
Mais cela produit une mauvaise sortie comme ci-dessous:
T
|
s
o
m
e
...
Mais ce que je veux c'est ceci:
T|somthing|something
T|something2|something2
J'ai aussi essayé avec tr
. Ça n'a pas marché non plus.
Réponses:
Utilisez ceci:
Ce que vous avez tenté ne fonctionne pas car sed utilise des expressions régulières de base , et votre implémentation sed a un
\|
opérateur qui signifie «ou» (une extension commune à BRE), donc ce que vous avez écrit remplace (chaîne vide ouEND
ou chaîne vide) par une nouvelle ligne.la source
\n
). La question demande comment remplacer|END|
par une nouvelle ligne, pas par\n
.Les éléments suivants ont bien fonctionné pour moi:
Notez que je viens de mettre une barre oblique inverse suivie de la touche Entrée.
la source
\n
as dans la réponse de @ AB ne fonctionnerait pas avec certainessed
implémentations.\|
pour l'alternance dans une expression rationnelle mais pas\n
pour une nouvelle ligne dans uns
remplacement?Vous pouvez utiliser
awk
:-F'\\|END\\|'
définissez le séparateur de champ sur|END|
OFS='\n'
définir le séparateur de champ de sortie sur la nouvelle ligne$1=$1
provoquer laawk
reconstruction$0
avecOFS
comme séparateur de champ1
est une valeur vraie, carawk
imprime toute la ligne d'entréela source
Un autre peut-être awkcommande et en utilisant son
RS
option serait:Imprimera ces dossiers (sur la base de awk R ECORD S de eparator) qui ne sont pas vides (a au moins un champ) pour empêcher l' impression des lignes vides.
Testé sur cette entrée:
Donne cette sortie:
Cela a effacé toutes les lignes vides :) Si vous voulez aussi avoir des sauts de ligne, remplacez
$1=$1
par$0
dans la commande:la source
$1=$1
condense les séquences de blancs en un seul espace et renvoie faux si le premier champ est 0. Cela n'a pas de sens. Vous voulez probablementawk 1 RS='\\|END\\|'
ouawk NF RS='\\|END\\|'
ouawk length RS='\\|END\\|'
ici. Notez qu'une regexp RS nécessite du gawk ou du mawkUne autre façon avec
sed
cela n'imprime pas les lignes vides:par exemple entrée:
production:
même chose avec
ed
:la source
Comme mentionné ici par Walter Mundt , nous pouvons y parvenir en utilisant une chaîne entre guillemets ANSI C
Consultez le lien ci-dessus ici pour d'autres alternatives.
Vous pouvez également utiliser la syntaxe suivante, je ne sais pas si cela fonctionne sur toutes les versions d'Unix / Linux
la source
J'ai eu un même problème dans le shell posix strict, je l'ai fait en deux passes avec un caractère inutilisé
la source