web-dev-qa-db-fra.com

comment supprimer les espaces de début de chaque ligne d'un fichier?

J'ai un fichier qui ressemble à quelque chose comme ça:

for (i = 0; i < 100; i++)
    for (i = 0; i < 100; i++)
  for (i = 0; i < 100; i++)
       for (i = 0; i < 100; i++)
     for (i = 0; i < 100; i++)
           for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)

Je veux que ça ressemble à ça (enlever les empreintes):

for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)

Comment cela peut-il être fait (en utilisant sed peut-être?)

55
Lazer
sed "s/^[ \t]*//" -i youfile

Attention: cela écrasera le fichier d'origine.

91
shuvalov

Pour ce problème spécifique, quelque chose comme ceci fonctionnerait:

$ sed 's/^ *//g' < input.txt > output.txt

Il est dit de remplacer tous les espaces au début d'une ligne par rien. Si vous souhaitez également supprimer des onglets, remplacez-le par ceci:

$ sed 's/^[ \t]+//g' < input.txt > output.txt

Le "s" initial avant le/signifie "substituer". Les/sont les délimiteurs des motifs. Les données entre les deux premiers/sont le motif à comparer, et les données entre les deuxième et troisième/sont les données pour le remplacer. Dans ce cas, vous remplacez par rien. Le "g" après la barre oblique finale signifie qu'il faut le faire "globalement", c'est-à-dire: sur tout le fichier plutôt que sur la seule correspondance trouvée.

Enfin, au lieu de < input.txt > output.txt, vous pouvez utiliser l’option -i qui signifie modifier le fichier "à la place". Cela signifie que vous n'avez pas besoin de créer un deuxième fichier pour contenir votre résultat. Si vous utilisez cette option, vous perdrez votre fichier d'origine. 

22
Bryan Oakley

vous pouvez utiliser awk

$ awk '{$1=$1}1' file
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)

sed

$ sed 's|^[[:blank:]]*||g' file
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)
for (i = 0; i < 100; i++)

Boucle while/read de Shell

while read -r line
do
    echo $line
done <"file"
10
ghostdog74

Ce code Perl édite votre fichier d'origine:

Perl -i -ne 's/^\s+//;print' file

Le suivant effectue une copie de sauvegarde avant de modifier le fichier d'origine:

Perl -i.bak -ne 's/^\s+//;print' file

Notez que Perl emprunte beaucoup à sed (et à awk)

5
Chris Koknat

FWIW, si vous êtes édition ce fichier, vous pouvez probablement mettre en surbrillance toutes les lignes et utiliser votre bouton sans tabulation. 

  • Dans vim, utilisez shift-v pour mettre les lignes en surbrillance, puis appuyez sur <<
  • Si vous êtes sur un Mac, vous pouvez utiliser Atom, Sublime, etc., puis mettez en surbrillance avec votre souris et appuyez ensuite sur shift-tab

Je ne sais pas s'il est nécessaire que cela soit fait à partir de la ligne de commande. Si oui, alors: pouce en l'air: à la réponse acceptée! =) 

0
Ben

sed -e 's/^ [\ t] * //' name_of_file_from_which_you_wou_want_to_remove_space> 'name _file_where_you_want_to_store_output'

par exemple: - sed -e 's/^ [\ t] * //' fichier1.txt> output.txt

Remarque:

s /: commande de remplacement ~ remplacement du motif (^ [\ t] *) sur chaque ligne adressée

^ [\ t] *: modèle de recherche (^ - début de la ligne; [\ t] * correspond à un ou plusieurs espaces vides, y compris la tabulation)

//: Remplacer (supprimer) tous les modèles correspondants

0
zahid

Voici:

user@Host:~$ sed 's/^[\t ]*//g' < file-in.txt

Ou:

user@Host:~$ sed 's/^[\t ]*//g' < file-in.txt > file-out.txt
0
Joao da Silva