Comment puis-je imprimer tout sauf les derniers n caractères dans bash?

Je travaille avec une input standard (en regroupant deux files set) et je souhaite que tous les 10 derniers caractères du résultat soient passés par la command suivante.

Tout ce que je peux find dans la search est d'utiliser sed , awk ou tr pour supprimer les n derniers caractères de chaque ligne, ou la head , la tail ou rev pour enlever n lignes.

Que pourrais-je utiliser pour faire cela à partir de la sortie standard canalisée dans une command (j'espère simplement et avec une seule command)?

Exemple:

 Input: SELECT 'A', 1, GETDATE() UNION ALL SELECT 'B', 2, GETDATE() UNION ALL ... SELECT 'Z', 2, GETDATE() UNION ALL Output: SELECT 'A', 1, GETDATE() UNION ALL SELECT 'B', 2, GETDATE() UNION ALL ... SELECT 'Z', 2, GETDATE() 

Pour ce que ça vaut, j'utilise CygWin sous Windows, donc ça doit être avec des outils standard plutôt vieux et unix 🙁

Vous pourriez utiliser la head :

 command | head -c-10 

supprimerait les 10 derniers octets de la sortie de la command .

Citant de la man head de l' man head :

  -c, --bytes=[-]K print the first K bytes of each file; with the leading `-', print all but the last K bytes of each file 

Puisque vous mentionnez spécifiquement que les 10 caractères à supprimer se produiraient sur une seule ligne, vous pourriez aussi utiliser sed . Pipe la sortie de la command à:

 sed '$s/\(.\{10\}\)$//' 

ou si votre sed supporte une regex étendue:

 sed -r '$s/.{10}$//' 

La syntaxe serait similaire en utilisant perl :

 perl -pe 's/.{10}$// if eof' 

Vous devez utiliser perl :

 $ perl -lpe '$_=substr($_,0,-10) if eof' file SELECT 'A', 1, GETDATE() UNION ALL SELECT 'B', 2, GETDATE() UNION ALL ... SELECT 'Z', 2, GETDATE()