Удалить последнюю строку моего текста с помощью bash? [Дубликат]

Если вы ищете один или несколько объектов, которые соответствуют определенным критериям, у вас есть несколько вариантов с помощью query-js

//will return all elements with an id larger than 1
data.items.where(function(e){return e.id > 1;});
//will return the first element with an id larger than 1
data.items.first(function(e){return e.id > 1;});
//will return the first element with an id larger than 1 
//or the second argument if non are found
data.items.first(function(e){return e.id > 1;},{id:-1,name:""});

Также есть single и singleOrDefault они работают так же, как first и firstOrDefault соответственно. Единственное отличие состоит в том, что они будут бросать, если больше , чем найдено одно совпадение.

для дальнейшего объяснения query-js вы можете начать с этой почты

98
задан Benjamin W. 20 March 2016 в 07:29
поделиться

20 ответов

Я не знаю о sed, но это можно сделать с помощью head:

head -n -2 myfile.txt
166
ответ дан laalto 25 August 2018 в 14:25
поделиться

Это можно сделать в 3 этапа:

a) Подсчитать количество строк в файле, который вы хотите отредактировать:

 n=`cat myfile |wc -l`

b) Вычесть из этого числа количество удаляемых строк:

 x=$((n-3))

c) Сообщите sed удалить из этого номера строки ($x) до конца:

 sed "$x,\$d" myfile
1
ответ дан Bertrand Martel 25 August 2018 в 14:25
поделиться

Я придумал это, где n - количество строк, которые вы хотите удалить:

count=`wc -l file`
lines=`expr "$count" - n`
head -n "$lines" file > temp.txt
mv temp.txt file
rm -f temp.txt

Это немного круговое движение, но я думаю, что это легко понять.

  1. Подсчитайте количество строк в основном файле
  2. Вычтите количество строк, которые вы хотите удалить из счета
  3. Распечатайте количество строк, которые вы хотите сохранить и сохраните в временном файле
  4. Замените основной файл временным файлом
  5. Удалите временный файл
0
ответ дан coyotetechy 25 August 2018 в 14:25
поделиться

В большинстве приведенных ответов требуются команды / расширения GNU:

    $ head -n -2 myfile.txt
    -2: Badly formed number

Для немного более переносимого решения:

     perl -ne 'push(@fifo,$_);print shift(@fifo) if @fifo > 10;'

ИЛИ

     perl -ne 'push(@buf,$_);END{print @buf[0 ... $#buf-10]}'

ИЛИ

     awk '{buf[NR-1]=$0;}END{ for ( i=0; i < (NR-10); i++){ print buf[i];} }'

Где «10» - «n».

2
ответ дан DarkHeart 25 August 2018 в 14:25
поделиться

Смешной & amp; простое решение sed и tac:

n=4
tac file.txt | sed "1,$n{d}" | tac

ПРИМЕЧАНИЕ [

]

  • нужны двойные кавычки ", чтобы оболочка оценивала переменную $n в sed. В одиночных кавычках интерполяция не будет выполнена.
  • tac - это cat в обратном порядке, см. man 1 tac
  • , {} в sed для разделения $n & amp; d (если нет, оболочка попытается интерполировать несуществующую переменную $nd)
  • 20
    ответ дан Gilles Quenot 25 August 2018 в 14:25
    поделиться

    Чтобы усечь очень большие файлы на самом деле, у нас есть команда truncate. Он не знает о строках, но tail + wc может преобразовывать строки в байты:

    file=bigone.log
    lines=3
    truncate -s -$(tail -$lines $file | wc -c) $file
    

    Существует очевидное условие гонки, если файл записывается в одно и то же время. В этом случае может быть лучше использовать head - он подсчитывает байты от начала файла (mind disk IO), поэтому мы всегда будем усекать на границе строки (возможно, больше строк, чем ожидалось, если файл активно написан):

    truncate -s $(head -n -$lines $file | wc -c) $file
    

    Handy one-liner, если вы не ввели попытку входа в систему, поставив пароль вместо имени пользователя:

    truncate -s $(head -n -5 /var/log/secure | wc -c) /var/log/secure
    
    4
    ответ дан Kamil Christ 25 August 2018 в 14:25
    поделиться

    Попробуйте выполнить следующую команду:

    n = line number
    tail -r file_name | sed '1,nd' | tail -r
    
    2
    ответ дан kenorb 25 August 2018 в 14:25
    поделиться

    Если hardcoding n является опцией, вы можете использовать последовательные вызовы sed. Например, чтобы удалить последние три строки, удалите последнюю строку трижды:

    sed '$d' file | sed '$d' | sed '$d'
    
    17
    ответ дан Kyle 25 August 2018 в 14:25
    поделиться

    Я предпочитаю это решение,

    head -$(gcalctool -s $(cat file | wc -l)-N) file
    

    , где N - количество удаляемых строк.

    0
    ответ дан Martin Tournoij 25 August 2018 в 14:25
    поделиться

    Просто для полноты я хотел бы добавить свое решение. Я закончил это со стандартом ed:

    ed -s sometextfile <<< $'-2,$d\nwq'
    

    Удаляет последние 2 строки, используя редактирование на месте (хотя делает использование временного файла в /tmp !!) [/ ​​g2]

    7
    ответ дан Michel 25 August 2018 в 14:25
    поделиться

    Чтобы удалить последние 4 строки:

    $ nl -b a file | sort -k1,1nr | sed '1, 4 d' | sort -k1,1n | sed 's/^ *[0-9]*\t//'   
    
    0
    ответ дан mstafreshi 25 August 2018 в 14:25
    поделиться
    sed -n ':pre
    1,4 {N;b pre
        }
    :cycle
    $!{P;N;D;b cycle
      }' YourFile
    

    posix version

    0
    ответ дан NeronLeVelu 25 August 2018 в 14:25
    поделиться

    Используйте sed, но пусть оболочка выполнит математику, с целью использовать команду d, указав диапазон (чтобы удалить последние 23 строки):

    sed -i "$(($(wc -l < file)-22)),\$d" file
    

    Чтобы удалить последние 3 строки изнутри:

    $(wc -l < file)
    

    Дает количество строк файла: say 2196

    Мы хотим удалить последние 23 строки, поэтому для левая сторона или диапазон:

    $((2196-22))
    

    Дает: 2174 Таким образом, исходный sed после интерпретации оболочки:

    sed -i 2174,$d file
    

    С -i, выполняющим редактирование на месте, теперь файл имеет 2173 строк !

    12
    ответ дан nstCactus 25 August 2018 в 14:25
    поделиться

    Это может сработать для вас (GNU sed):

    sed ':a;$!N;1,4ba;P;$d;D' file
    
    4
    ответ дан potong 25 August 2018 в 14:25
    поделиться

    Из sed one-liners :

    # delete the last 10 lines of a file
    sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # method 1
    sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # method 2
    

    Кажется, это то, что вы любите.

    22
    ответ дан qstebom 25 August 2018 в 14:25
    поделиться

    Это приведет к удалению последних 12 строк

    sed -n -e :a -e '1,10!{P;N;D;};N;ba'
    
    0
    ответ дан R. Kumar 25 August 2018 в 14:25
    поделиться

    Вы можете использовать головку для этого.

    Используйте

    $ head --lines=-N file > new_file

    , где N - количество строк, которые вы хотите удалить из файла.

    Содержимое исходного файла минус последние N строк теперь находится в файле new_file

    8
    ответ дан richard 25 August 2018 в 14:25
    поделиться

    С ответами здесь вы уже узнали бы, что sed не лучший инструмент для этого приложения.

    Однако я думаю, что есть способ сделать это при использовании sed; идея состоит в том, чтобы добавить N строк для удержания пространства, пока вы не сможете читать, не нажимая EOF. Когда EOF попал, напечатайте содержимое пространства удержания и закройте.

    sed -e '$!{N;N;N;N;N;N;H;}' -e x
    

    Команда sed выше будет опускать последние 5 строк.

    2
    ответ дан Rishabh Sagar 25 August 2018 в 14:25
    поделиться

    Вы можете получить общее количество строк с помощью wc -l <file> и использовать

    head -n <total lines - lines to remove> <file>

    1
    ответ дан SWW13 25 August 2018 в 14:25
    поделиться

    Это удалит последние 3 строки из file:

    for i in $(seq 1 3); do sed -i '$d' file; done;

    0
    ответ дан wpercy 25 August 2018 в 14:25
    поделиться
    Другие вопросы по тегам:

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