2 votes

Supprime tout ce qui se trouve dans un fichier délimité par des tubes après l'avant-dernier tube.

Comment supprimer tout ce qui se trouve dans un fichier délimité par des tubes après l'avant-dernier tube ? Comme pour la ligne

David|3456|ACCOUNT|MALFUNCTION|CANON|456

le résultat devrait être

David|3456|ACCOUNT|MALFUNCTION

2voto

Walter A Points 129

Remplacer |(string without pipe)|(string without pipe) à la fin de chaque ligne :

sed 's/|[^|]*|[^|]*$//' inputfile

1voto

Inian Points 36223

Utilisation de awk quelque chose comme

awk -F'|' 'BEGIN{OFS="|"}{NF=NF-2; print}' inputfile
David|3456|ACCOUNT|MALFUNCTION

(ou) utiliser cut si vous connaissez le nombre de colonnes au total, c'est-à-dire 6 -> 4

cut -d'|' -f -4 inputfile
David|3456|ACCOUNT|MALFUNCTION

0voto

Jake Points 36

La commande que j'utiliserais est

cat input.txt | sed -r 's/(.*)\|.*/\1/' > output.txt

0voto

pjh Points 1139

Une solution de pur Bash :

while IFS= read -r line || [[ -n $line ]] ; do
    printf '%s\n' "${line%|*|*}"
done <inputfile

Véase La lecture des fichiers d'entrée ligne par ligne à l'aide de la commande read dans les scripts shell fait sauter la dernière ligne. (notamment le réponse de Jahid ) pour plus de détails sur la façon dont l while La boucle fonctionne.

Véase filtrage de motifs en Bash pour des informations sur ${line%|*|*} .

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