Pourquoi cette commande sed ne fait-elle rien à l’intérieur d’un script bash mais fonctionne à l’extérieur?

# join pairs of lines side-by-side (like "paste") sed '$!N;s/\n/ /' 

Le script ci-dessus provient de la grande liste des fichiers one-line trouvés sur sourceforge.

Je souhaite l’utiliser dans un script bash mais cela n’a aucun effet si elle est utilisée dans le script. Si je diffuse la sortie du script, elle joint les paires de lignes côte à côte comme décrit.

Certains personnages doivent être échappés, mais je ne peux pas “voir” quel personnage doit être échappé pour le faire fonctionner dans un script bash.

Yoroshiku Onegaishimasu!

Plus tard..

 #!/bin/bash # numbers.sh for X in 1 2 3 4 5 6 7 8 9 0 do echo $X done 

Quand utilisé ce script:

 #!/bin/bash ./numbers.sh | sed '$!N;s/\n/ /' 

fonctionne bien ..

 1 2 3 4 5 6 7 8 9 0 

S’il vous plaît laissez-moi regrouper mes pensées à ce sujet ..

Plus tard…

J’ai trouvé l’erreur logique dans le script qui l’a brisé.

Ce n’est pas évident pour moi quel est le problème sans voir votre script. Un test rapide ici et cela fonctionnait très bien dans un script simple:

 #!/bin/bash cat /etc/crontab | sed '$!N;s/\n/ /' 

Si vous essayez d’intégrer la commande dans une chaîne ou une variable, le \ n sera un candidat d’échappement.

Pour ce que cela vaut, il est rare de créer des scripts spécifiques à bash sur des scripts shell compatibles avec / bin / sh, à moins que vous ayez vraiment besoin des conteneurs avancés (ce qui est rare). Vous vous retrouverez avec un script beaucoup plus portable sur des dizaines d’autres shells compatibles avec Posix / Korn / Bourne (y compris bash).

À votre santé! Sean

Manque-t-il le "$@" pour indiquer les arguments de nom de fichier? Il ne faisait que lire à partir de l’entrée standard?

Quelle était la mauvaise conduite? Le fichier a-t-il été simplement copié sur la sortie standard?

Fonctionne pour moi – sous Cygwin. ‘ al ‘ est un programme qui répertorie ses arguments un par ligne.

 $ al abcdef | sed '$!N;s/\n/ /' ab cd ef $ cat xxx sed '$!N;s/\n/ /' $ al abcdefg | bash xxx ab cd ef g $