У меня есть файл foo.txt
, содержащий следующие строки:
a
b
c
Я хочу простую команду, которая приводит к содержанию foo.txt
бытия:
a
b
bash
command-line
scripting
truncate
Fragsworth
источник
источник
sed -i
команды вышеsed -i '' -e '$ d' foo.txt
. Кроме того, вhead -n -1
настоящее время не будет работать на Mac.$ d
регулярным выражением. Это команда sed.d
это команда для удаления строки, в то время как$
означает «последняя строка в файле». При указании местоположения (называемого «диапазон» в sed lingo) перед командой эта команда применяется только к указанному местоположению. Таким образом, эта команда явно говорит: «в диапазоне последней строки в файле, удалите его». Довольно гладко и прямо к делу, если вы спросите меня.На сегодняшний день это самое быстрое и простое решение, особенно для больших файлов:
если вы хотите удалить верхнюю строку, используйте это:
что означает выходные строки, начинающиеся со строки 2.
Не используйте
sed
для удаления строк сверху или снизу файла - это очень очень медленно, если файл большой.источник
head -n -1 foo.txt
достаточноbrew install coreutils
(основные утилиты GNU) и использоватьghead
вместоhead
.FILE=$1; TAIL=$2; head -n -${TAIL} ${FILE} > temp ; mv temp ${FILE}
Запустите его для удаления 4 строк, например, из myfile, как:./TAILfixer myfile 4
конечно, сначала сделайте его исполняемым с помощьюchmod +x TAILfixer
sed
, эта команда тоже чертовски медленнаяУ меня были проблемы со всеми ответами здесь, потому что я работал с огромным файлом (~ 300 Гб), и ни одно из решений не масштабировалось. Вот мое решение:
Другими словами: определите длину файла, который вы хотите получить (длина файла минус длина его последней строки, используя
bc
), и установите эту позицию как конец файла (используяdd
один байт/dev/null
на Это).Это быстро, потому что
tail
начинает чтение с конца иdd
перезаписывает файл на месте, а не копирует (и анализирует) каждую строку файла, что и делают другие решения.ПРИМЕЧАНИЕ: это удаляет строку из файла на месте! Сделайте резервную копию или протестируйте фиктивный файл перед тем, как опробовать его на своем собственном файле!
источник
Чтобы удалить последнюю строку из файла, не читая весь файл и не переписывая что-либо , вы можете использовать
Чтобы удалить последнюю строку, а также вывести ее на стандартный вывод («вывести»), вы можете объединить эту команду с
tee
:Эти команды могут эффективно обрабатывать очень большой файл. Это похоже на ответ Йосси и вдохновлено им, но избегает использования нескольких дополнительных функций.
Если вы собираетесь использовать их несколько раз и хотите обрабатывать ошибки и некоторые другие функции, вы можете использовать
poptail
команду здесь: https://github.com/donm/evenmoreutilsисточник
truncate
не доступно в OS X по умолчанию. Но это легко установить с помощью Brew:brew install truncate
.если вы хотите, чтобы последняя строка удаляла вывод без изменения самого файла, сделайте
sed -e '$ d' foo.txt
если вы хотите удалить последнюю строку самого входного файла, сделайте
sed -i '' -e '$ d' foo.txt
источник
-i ''
указывает sed изменять файл на месте, сохраняя резервную копию в файле с расширением, предоставленным в качестве параметра. Поскольку параметр является пустой строкой, файл резервной копии не создается.-e
говорит sed выполнить команду. Команда$ d
означает: найти последнюю строку ($
) и удалить ее (d
).Для пользователей Mac:
На Mac голова -n -1 не будет работать. И я пытался найти простое решение [не беспокоясь о времени обработки], чтобы решить эту проблему только с помощью команд «head» и / или «tail».
Я попробовал следующую последовательность команд и был счастлив, что смог решить ее, используя команду «tail» [с опциями, доступными на Mac]. Итак, если вы находитесь на Mac и хотите использовать только «хвост» для решения этой проблемы, вы можете использовать эту команду:
Пояснение:
1> tail -r: просто меняет порядок строк на входе
2> tail -n +2: печатает все строки, начиная со второй строки в своем входе
источник
ghead -n -1
источник
sed '$d'
.По сути, этот код говорит следующее:
Для каждой строки после первой выведите буферизованную строку
для каждой строки сбросьте буфер
Буфер отстает на одну строку, следовательно, вы заканчиваете печать строк от 1 до n-1
источник
Этот фрагмент делает свое дело.
источник
Оба эти решения находятся здесь в других формах. Я нашел это немного более практичным, понятным и полезным:
Используя дд:
Используя усечение:
источник
Linux
$ - последняя строка, d для удаления:
MacOS
Эквивалент Сед-я
источник
Вот как вы можете сделать это вручную (я лично часто использую этот метод, когда мне нужно быстро удалить последнюю строку в файле):
Который
+
знак означает, что когда файл открывается в текстовом редакторе vim, курсор будет помещен в последнюю строку файла.Теперь просто
d
дважды нажмите на клавиатуре. Это будет делать именно то, что вы хотите - удалить последнюю строку. После этого нажмите:
,x
а затем нажмитеEnter
. Это сохранит изменения и вернет вас в оболочку. Теперь последняя строка была успешно удалена.источник
Рубин (1.9+)
источник