it-swarm.com.de

wie entferne ich führende Leerzeichen aus jeder Zeile in einer Datei?

Ich habe eine Datei, die ungefähr so ​​aussieht:

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++)

Ich möchte, dass es so aussieht (Einrückungen entfernen):

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++)

Wie kann das gemacht werden (vielleicht mit sed?)

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

Achtung: Dadurch wird die Originaldatei überschrieben.

91
shuvalov

Für dieses spezielle Problem würde so etwas funktionieren:

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

Es heißt, alle Leerzeichen am Anfang einer Zeile durch nichts zu ersetzen. Wenn Sie auch Registerkarten entfernen möchten, ändern Sie es wie folgt:

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

Das führende "s" vor dem/bedeutet "Ersatz". Die/sind die Trennzeichen für die Muster. Die Daten zwischen den ersten beiden Werten sind das zu übereinstimmende Muster, und die Daten zwischen den zweiten und dritten sind die Daten, durch die sie ersetzt werden sollen. In diesem Fall ersetzen Sie es durch nichts. Das "g" nach dem letzten Schrägstrich bedeutet "global", dh über die gesamte Datei und nicht nur über die erste Übereinstimmung, die gefunden wird.

Anstelle von < input.txt > output.txt können Sie schließlich die -i-Option verwenden, um die Datei "in place" zu bearbeiten. Das heißt, Sie müssen keine zweite Datei erstellen, um Ihr Ergebnis zu enthalten. Wenn Sie diese Option verwenden, verlieren Sie Ihre Originaldatei. 

22
Bryan Oakley

sie können awk verwenden

$ 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++)

Shell/while-Schleife

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

Dieser Perl-Code bearbeitet Ihre Originaldatei:

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

Die nächste erstellt eine Sicherungskopie, bevor die Originaldatei bearbeitet wird:

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

Beachten Sie, dass sich Perl stark von sed (und awk) borgt.

5
Chris Koknat

FWIW, wenn Sie diese Datei editieren, können Sie wahrscheinlich alle Zeilen hervorheben und Ihre un-tab-Taste verwenden. 

  • Heben Sie in vim mit shift-v die Zeilen hervor und drücken Sie dann <<
  • Wenn Sie sich auf einem Mac befinden, können Sie Atom, Sublime usw. verwenden, dann mit der Maus markieren und die Umschalttaste drücken

Nicht sicher, ob es von der Befehlszeile aus erforderlich ist, dies zu tun. Wenn ja, dann: Daumen hoch: zur akzeptierten Antwort! =) 

0
Ben

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

Beispiel: - sed -e 's/^ [\ t] * //' file1.txt> output.txt

Hinweis:

s /: Ersetzen Sie den Befehl ~ Ersetzung für Muster (^ [\ t] *) in jeder adressierten Zeile

^ [\ t] *: Suchmuster (^ - Anfang der Zeile; [\ t] * entspricht einem oder mehreren Leerzeichen einschließlich Tabulator)

//: Alle übereinstimmenden Muster ersetzen (löschen)

0
zahid

Bitte schön:

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

Oder:

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