Как убрать начальные пробелы из каждой строки в файле - PullRequest
59 голосов
/ 22 февраля 2010

У меня есть файл, который выглядит примерно так:

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

Я хочу, чтобы это выглядело так (удалите отступы):

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

Ответы [ 7 ]

103 голосов
/ 22 февраля 2010
sed "s/^[ \t]*//" -i youfile

Предупреждение: это заменит исходный файл.

25 голосов
/ 22 февраля 2010

Для этой конкретной задачи что-то вроде этого будет работать:

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

В нем говорится, что все пробелы в начале строки должны быть заменены ничем. Если вы также хотите удалить вкладки, измените это на:

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

Начальная буква "s" перед / означает "заменить". Символы / являются разделителями для шаблонов. Данные между первыми двумя / являются шаблоном для сопоставления, а данные между вторым и третьим / - это данные для его замены. В этом случае вы заменяете его ничем. «G» после последней косой черты означает «глобально», то есть: по всему файлу, а не только по первому найденному совпадению.

Наконец, вместо < input.txt > output.txt вы можете использовать опцию -i, которая означает редактирование файла "на месте". Это означает, что вам не нужно создавать второй файл, который будет содержать ваш результат. Если вы используете эту опцию, вы потеряете свой оригинальный файл.

11 голосов
/ 22 февраля 2010

Вы можете использовать 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 '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++)

Оболочка while / read петля

while read -r line
do
    echo $line
done <"file"
5 голосов
/ 22 сентября 2015

Этот код Perl редактирует ваш оригинальный файл:

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

Следующая делает резервную копию перед редактированием исходного файла:

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

Обратите внимание, что Perl сильно заимствует у sed (и awk)

0 голосов
/ 02 ноября 2017

FWIW, если вы редактируете этот файл, вы, вероятно, можете выделить все строки и использовать кнопку отмены вкладок.

  • В vim используйте shift-v, чтобы выделить линии, затем нажмите << </li>
  • Если вы работаете на Mac, вы можете использовать Atom, Sublime и т. Д., Затем выделите мышью и нажмите Shift-Tab

Не уверен, если есть какое-то требование, что это должно быть сделано из командной строки. Если так, то: thumbs-up: до принятого ответа! =)

0 голосов
/ 27 июля 2017

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

например: - sed -e 's / ^ [\ t] * //' file1.txt> output.txt

Примечание:

s /: Подставить команду ~ замена для шаблона (^ [\ t] *) в каждой адресуемой строке

^ [\ t] *: шаблон поиска (^ - начало строки; [\ t] * соответствует одному или нескольким пробелам, включая символ табуляции)

//: заменить (удалить) весь сопоставленный шаблон

0 голосов
/ 22 февраля 2010

Вот, пожалуйста:

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

Или:

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