J'utilise sed
depuis un certain temps, mais voici une bizarrerie que j'ai trouvée , que je ne suis pas en mesure de résoudre.
Permettez-moi d'expliquer mon problème avec le cas réel.
Scène 1
printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard
Dans la première commande, je dirige la printf
sortie vers xclip
afin qu'elle soit copiée dans le presse-papiers. Maintenant, printf
contrairement à echo
n'insère pas une nouvelle ligne à la fin par défaut. Donc, si je colle ce contenu dans le terminal, la ls
commande copiée ne s'exécute pas automatiquement.
Dans le second, il y a une nouvelle ligne à la fin, donc coller le contenu du presse-papiers entraîne également l'exécution de la commande dans le presse-papiers.
C'est indésirable pour moi. Donc, je voulais supprimer la nouvelle ligne en utilisant sed
, mais cela a échoué, comme expliqué dans la scène ci-dessous.
Scène # 2
echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard
Le contenu du presse-papiers contient toujours une nouvelle ligne. Lorsque je le colle dans le terminal, la commande s'exécute automatiquement.
J'ai également essayé de supprimer le caractère de retour chariot \r
. Mais nada. Il semble que je manque quelque chose de très crucial / fondamental ici.
generate-text | xclip
cas. Cette réponse supprime uniquement la dernière nouvelle ligne.De nombreux outils de traitement de texte, y compris sed, fonctionnent sur le contenu de la ligne, à l'exception du caractère de nouvelle ligne. La première chose que sed fait lors du traitement d'une ligne est de supprimer la nouvelle ligne à la fin, puis il exécute les commandes dans le script et ajoute une nouvelle ligne finale lors de l'impression. Vous ne pourrez donc pas supprimer la nouvelle ligne avec sed.
Pour supprimer toutes les nouvelles lignes, vous pouvez utiliser à la
tr
place:la source
Vous pouvez remplacer les sauts de ligne dans sed en lui passant l' option -z .
Page de manuel Sed:
la source
| xclip
cas.Si vous placez simplement des commandes dans le presse-papiers
Si vous devez également effectuer des transformations plus complexes,
la source
perl
etpython
sont tous deux beaucoup plus lents que ceux quised
peuvent être utilisés correctement. Cependant, apprendre à l'utiliser correctement est la clé.sed
peut faire bien plus que gérer uniquement vos monolignes, et elle peut probablement le faire plus rapidement que n'importe lequel des autres outils que vous mentionnez.Pour supprimer uniquement la dernière nouvelle ligne , passez par:
sed
n'ajoutera pas de a\0
à la fin du flux si le délimiteur est défini surNUL
via-z
, alors que pour créer un fichier texte POSIX (défini pour se terminer par a\n
), il affichera toujours une finale\n
sans-z
.Par exemple:
Et pour prouver non
NUL
ajouté:Pour supprimer plusieurs sauts de ligne de fin , passez par:
la source