web-dev-qa-db-fra.com

Comment remplacer un mot avec une nouvelle ligne

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.

11
Sas

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.

15
A.B.

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.

7
unxnut

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 champ
  • 1 est une valeur vraie, Cause awk impression de la ligne d'entrée entière
5
cuonglm

Une 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
3
αғsнιη

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
3
don_crissti

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

~ $
1
k_vishwanath

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'
0
Benamar