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|
Je suis essai pour remplacer |END|
avec \n
nouvelle ligne avec SED.
sed 's/\|END\|/\n/g' test.txt
Mais il produit un mauvais résultat 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
. Cela n'a pas fonctionné non plus.
Utilisez ceci:
sed 's/|END|/\n/g' test.txt
Ce que vous avez essayé ne fonctionne pas parce que SED utilise expressions régulières de base et votre implémentation de SED a un \|
opérateur signifiant "ou" (une extension commune à BRE), alors ce que vous avez écrit remplace (chaîne vide ou END
ou chaîne vide) par une nouvelle ligne.
Ce qui suit a fonctionné bien pour moi:
$ sed 's/|END|/\
/g' foobar
T|somthing|something
T|something2|something2
Notez que je viens de mettre une barre oblique inverse suivie de la clé Entrée.
Vous pouvez utiliser awk
:
$ awk -F'\\|END\\|' '{$1=$1}1' OFS='\n' file
T|somthing|something
T|something2|something2
-F'\\|END\\|'
Définir le séparateur de champ sur |END|
OFS='\n'
Définir le séparateur de champ de sortie à la nouvelle ligne$1=$1
cause awk
reconstruit $0
avec OFS
comme séparateur de champ1
est une valeur vraie, Cause awk
impression de la ligne d'entrée entièreUne autre commande éventuellement awk et l'utilisation de son option RS
serait la suivante:
awk '$1=$1' RS="\|END\|" file
Imprimera ces enregistrements (basé sur AWK [~ # ~] r [~ # ~ ~] ECORD [~ # ~] s [~ # ~] Eparator) qui ne sont pas vides (comptent au moins un champ) pour empêcher l'impression de lignes vides.
Testé sur cette entrée:
T|somthing|something|END|T|something2|something2|END|
Test|END|
|END|
Donne cette sortie:
T|somthing|something
T|something2|something2
Test
Cela a effacé toutes les lignes vides :) si vous voulez avoir des lignes neuves aussi, remplacez $1=$1
avec $0
en commande:
awk '$0' RS="\|END\|" file
Une autre façon avec sed
qui n'imprime pas les lignes vides:
sed 's/|END|/\
/g;/^$/!P;D' infile
par exemple. saisir:
T|one|two|END|T|three|four|END|
T|five|six|END|T|seven|eight|END|
T|nine|ten|END|T|eleven|twelve|END|
sortir:
T|one|two
T|three|four
T|five|six
T|seven|eight
T|nine|ten
T|eleven|twelve
même chose avec ed
:
ed -s infile <<'IN'
1,$j
s/|END|/\
/g
,p
q
IN
Comme mentionné ici by Walter Mundt , nous pouvons y parvenir à l'aide d'une chaîne de coordie ANSI C
sed $'s/|END|/\\\n/g'
~ $ echo 'T|somthing|something|END|T|something2|something2|END|' | sed
$'s/|END|/\\\n/g'
T|somthing|something
T|something2|something2
~ $
Découvrez 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 saveurs de Unix/Linux
sed 's/|END|/\'$'\n''/g'
~ $ echo 'T|somthing|something|END|T|something2|something2|END|' | sed
's/|END|/\'$'\n''/g'
T|somthing|something
T|something2|something2
~ $
J'ai eu un même problème dans Strict Posix Shell que je l'ai fait en deux pass avec un caractère inutilisé
cat data.json|tr '§' '?'|sed -e 's/"[^"]":/§&/g'|tr '§' '\n'