2 votes

Échapper au délimiteur entre les fichiers de date lors de l'utilisation de sed

J'essaie de supprimer le délimiteur | avec les guillemets en utilisant sed sur un texte qui contient des dates, des zéros, des chaînes de caractères avec un délimiteur de type pipe. J'ai utilisé le sed suivant qui fonctionne bien mais qui supprime le délimiteur entre les dates. Toute aide sera appréciée.

sed -E 's/(^|[^"|])\|($|[^"|])/\1 \2/g' <file>

Entrée :

"Southern|Palms"|"AA|None"|"4"|"Ken|Coast"|1/11/2019 00:00:00|30/4/2020 00:00:00|"TH"|

Retours :

"Southern Palms"|"AA None"|"4"|"Ken Coast"|1/11/2019 00:00:00 30/4/2020 00:00:00|"TH"|

Résultats attendus :
"Southern Palms"|"AA None"|"4"|"Ken Coast"|1/11/2019 00:00:00|30/4/2020 00:00:00|"TH"|

2voto

Ed Morton Points 25374

Avec GNU awk pour FPAT :

$ awk -v FPAT='[^|]*|"[^"]+"' -v OFS='|' '{for (i=1;i<=NF;i++) gsub(/\|+/," ",$i)} 1' file
"Southern Palms"|"AA None"|"4"|"Ken Coast"|1/11/2019 00:00:00|30/4/2020 00:00:00|"TH"|

Voir Quel est le moyen le plus robuste d'analyser efficacement un fichier CSV à l'aide d'awk ?

1voto

ventsyv Points 1164

Que diriez-vous de.. :

sed -E 's/(\w+)\|(\w+)/\1 \2/g' testfile.txt

\w +\| \w + correspond aux symboles de pipe entre deux mots, comme ceci <word1>|<word2> et le remplace par les deux mots séparés par un espace comme ceci <word1> <word2>

Si vous voulez faire correspondre les guillemets, utilisez :

sed -E 's/("\w+)\|(\w+")/\1 \2/g' testfile.txt

Cela correspond "<word1>|<word2>" et le remplace par "<word1> <word2>"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X