Как я могу обрезать содержимое текстового файла?

Вы можете использовать wget для отправки HTTP-запроса. Например:

wget http://unix.stackexchange.com
2
11.04.2018, 19:41
6 ответов

Используйтеsed:

sed -z 's/^\s*//; s/\s*$//' infile
  • s/^\s*//, удаляет пробелы/пустые строки в самом начале infileв качестве входного файла.

  • s/\s*$//, удалены пробелы/пустые строки в самом конце infileв качестве входного файла, включая \nв самом конце infile.

Примерcat -e infile:

$
$
$
Three blank lines above$
$
$
Two blank lines in the middle$
a blank lines below$
$
a line with trailing whitespaces                $
          a line with leading whitespaces$
below are two empty lines + one whitespaces then an empty line again$
$
$
                                    $
$

Выход:

Three blank lines above


Two blank lines in the middle
a blank lines below

a line with trailing whitespaces
          a line with leading whitespaces
below are two empty lines + one whitespaces then an empty line again

Или вы можете использовать printfдля вывода результата sed, который удалил самые первые пробелы/пустые строки и использовал его в подстановке команд, которая удаляет пустые строки только в самом конце и \n.

printf '%s' "$(sed -z 's/^\s*//' infile)"
0
27.01.2020, 22:09

Ну, не шелл-скрипт, а PHP-решение, которое я написал:

имя скрипта:trimfile.php

<?php
if ( (!empty($argv[1])) && (file_exists($argv[1])) )  {
    $file_contents = file_get_contents($argv[1]);
    $new_file_contents = trim($file_contents). "\n";
    if ($file_contents <> $new_file_contents) {
        file_put_contents($argv[1], $new_file_contents);
    }
}
?>

Использование:

$ php trimfile.php yourfile.txt
0
27.01.2020, 22:09

Если вы хотите удалить все пробелы и новые строки, а не только последнюю новую строку, вы можете использоватьtr:

tr -d '[[:space:]]' < file > file.trimmed

Или, точнее:

tr -d '\t\n ' < file > file.trimmed
2
27.01.2020, 22:09

Предположим, вы хотите удалить начальные/конечные пробелы для каждой строки , а не для файла в целом.

Тестовый файл, в котором некоторые строки имеют начальные или конечные пробелы, а также пустые строки.:

$ cat -e file
line 1$
  line 2$
line 3 has trailing spaces   $
$
blank line above$

И команда GNU sed для обрезки

$ sed -r 's/^\s+//; s/\s+$//; /^$/d' file | cat -e
line 1$
line 2$
line 3 has trailing spaces$
blank line above$
0
27.01.2020, 22:09

Вawk:

                 { isblank = 0 }
/^[[:blank:]]*$/ { isblank = 1 }

state == 0 &&  isblank { next }
state == 0 && !isblank { state = 1 }

state == 1 &&  isblank { buffer[++n] = $0 }
state == 1 && !isblank { for (i = 1; i <= n; ++i) print buffer[i]; n = 0; print }

stateобозначает, в каком состоянии находится программа. Когда state == 0, программа удалит все пустые строки. Пустая строка — это строка, которая пуста или содержит только пробелы или символы табуляции (, что соответствует [[:blank:]]). Программа остается в state == 0до тех пор, пока не будет найдена не-пустая строка. Это обрезает начало файла.

При state == 1программа будет сохранять пустые строки в массив buffer. Эти пустые строки необходимо вывести, как только будет найдена пустая строка, отличная от -. Если не найдено не -пустых строк, они будут отброшены (, это обрезает конец файла ).

Общий эффект заключается в том, что пустые строки в начале и конце файла удаляются, в то время как пустые строки в других местах сохраняются (, включая их пробелы или табуляции, если они содержались в исходном файле ).

Тестирование:

$ cat file



Three blank lines above


Two blank lines in the middle
Three blank lines below



$ awk -f trim.awk file
Three blank lines above


Two blank lines in the middle
Three blank lines below

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

$ awk -f trim.awk file | sed -e '1s/^[[:blank:]]*//' -e '$s/[[:blank:]]*$/'
1
27.01.2020, 22:09

Вы можете попробовать ed, которого, к сожалению, нет в стандартной установке Debian.

printf '%s\n' \
 'g/[^[:blank:]][^[:blank:]]*/kx' \
 "'"'x,$j' \
 '$s/[[:blank:]]*$//' \
 '/[^[:blank:]][^[:blank:]]*/kx' \
 '1,'"'"'xj' \
 '1s/^[[:blank:]]*//' \
 'wq' | 
ed -s infile

Или с гну сэд

sed -Ezi 's/^\s+|\s+$//g;s/$/\n/' infile
0
27.01.2020, 22:09

Теги

Похожие вопросы