J'ai un script shell simple qui supprime les espaces de fin d'un fichier. Existe-t-il un moyen de rendre ce script plus compact (sans créer de fichier temporaire)?
sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp
sed
whitespace
Viktor
la source
la source
mv
place decat
etrm
. Pourquoi utilisez-vouscat
comme ça de toute façon? Pourquoi ne pas l'utilisercp
?cat
pour écraser le fichier original plutôt que demv
remplacer réellement les données dans le fichier original (c'est-à-dire que cela ne rompra pas les liens physiques). Utilisersed -i
comme proposé dans de nombreuses solutions ne fera pas cela. IOW, continue de faire ce que tu fais.Réponses:
Vous pouvez utiliser l'option en place
-i
desed
pour Linux et Unix:Sachez que l'expression supprimera les
t
derniers sur OSX (vous pouvez utilisergsed
pour éviter ce problème). Il peut également les supprimer sur BSD.Si vous n'avez pas gsed, voici la syntaxe sed correcte (mais difficile à lire) sous OSX:
Trois chaînes entre guillemets simples sont finalement concaténées en un seul argument / expression. Il n'y a pas d'opérateur de concaténation dans bash, vous placez simplement les chaînes l'une après l'autre sans espace entre les deux.
Le
$'\t'
résout comme un caractère de tabulation littéral dans bash (en utilisant les guillemets ANSI-C ), de sorte que l'onglet est correctement concaténé dans l'expression.la source
sed: Not a recognized flag: i
t
:)\t
est un onglet, pour ceux qui ne le savent peut-être pas déjà.Au moins sur Mountain Lion, la réponse de Viktor supprimera également le caractère «t» lorsqu'il est à la fin d'une ligne. Ce qui suit résout ce problème:
la source
-E
indication "expressions régulières étendues (modernes)"sed
sur El Capitan ne l'a pas fait.Merci à codaddict d'avoir suggéré l'
-i
option.La commande suivante résout le problème sur Snow Leopard
la source
\t
avec sed autre que GNU sed et il est interprété comme une lettre littéralet
. La commande ne semble fonctionner que, probablement parce qu'il n'y a pas de tabulation dans l'espace blanc de fin ni unt
à la fin d'une phrase dans votre fichier. L'utilisation''
sans spécifier de suffixe de sauvegarde n'est pas recommandée.Il est préférable de citer également 1 $:
la source
la source
J'ai un script dans mon .bashrc qui fonctionne sous OSX et Linux (bash uniquement!)
auquel j'ajoute:
la source
Pour ceux qui recherchent l'efficacité (beaucoup de fichiers à traiter, ou de gros fichiers), utiliser l'
+
opérateur de répétition au lieu de*
rend la commande plus de deux fois plus rapide.Avec GNU sed:
J'ai également rapidement évalué autre chose: utiliser
[ \t]
au lieu d'[[:space:]]
accélérer considérablement le processus (GNU sed v4.4):la source
Juste pour le fun:
la source
Dans le cas spécifique de
sed
, l'-i
option que d'autres ont déjà mentionnée est de loin la plus simple et la plus saine.Dans le cas plus général
sponge
, à partir de lamoreutils
collection, fait exactement ce que vous voulez: il vous permet de remplacer un fichier par le résultat de son traitement, d'une manière spécialement conçue pour empêcher l'étape de traitement de trébucher sur elle-même en écrasant le fichier même qu'il travaille sur. Pour citer lasponge
page de manuel:https://joeyh.name/code/moreutils/
la source
Pour supprimer uniquement les espaces (dans mon cas, les espaces et les tabulations) des lignes avec au moins un caractère non blanc (de cette façon, les lignes vides en retrait ne sont pas touchées):
la source