Если вы ищете один или несколько объектов, которые соответствуют определенным критериям, у вас есть несколько вариантов с помощью 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 вы можете начать с этой почты
Я не знаю о sed
, но это можно сделать с помощью head
:
head -n -2 myfile.txt
Это можно сделать в 3 этапа:
a) Подсчитать количество строк в файле, который вы хотите отредактировать:
n=`cat myfile |wc -l`
b) Вычесть из этого числа количество удаляемых строк:
x=$((n-3))
c) Сообщите sed удалить из этого номера строки ($x
) до конца:
sed "$x,\$d" myfile
Я придумал это, где n - количество строк, которые вы хотите удалить:
count=`wc -l file`
lines=`expr "$count" - n`
head -n "$lines" file > temp.txt
mv temp.txt file
rm -f temp.txt
Это немного круговое движение, но я думаю, что это легко понять.
В большинстве приведенных ответов требуются команды / расширения 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».
Смешной & 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
) Чтобы усечь очень большие файлы на самом деле, у нас есть команда 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
Попробуйте выполнить следующую команду:
n = line number
tail -r file_name | sed '1,nd' | tail -r
Если hardcoding n является опцией, вы можете использовать последовательные вызовы sed. Например, чтобы удалить последние три строки, удалите последнюю строку трижды:
sed '$d' file | sed '$d' | sed '$d'
Я предпочитаю это решение,
head -$(gcalctool -s $(cat file | wc -l)-N) file
, где N - количество удаляемых строк.
Просто для полноты я хотел бы добавить свое решение. Я закончил это со стандартом ed
:
ed -s sometextfile <<< $'-2,$d\nwq'
Удаляет последние 2 строки, используя редактирование на месте (хотя делает использование временного файла в /tmp
!!) [/ g2]
Чтобы удалить последние 4 строки:
$ nl -b a file | sort -k1,1nr | sed '1, 4 d' | sort -k1,1n | sed 's/^ *[0-9]*\t//'
sed -n ':pre
1,4 {N;b pre
}
:cycle
$!{P;N;D;b cycle
}' YourFile
posix version
Используйте 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 строк !
Это может сработать для вас (GNU sed):
sed ':a;$!N;1,4ba;P;$d;D' file
Из 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
Кажется, это то, что вы любите.
Это приведет к удалению последних 12 строк
sed -n -e :a -e '1,10!{P;N;D;};N;ba'
Вы можете использовать головку для этого.
Используйте
$ head --lines=-N file > new_file
, где N - количество строк, которые вы хотите удалить из файла.
Содержимое исходного файла минус последние N строк теперь находится в файле new_file
С ответами здесь вы уже узнали бы, что sed не лучший инструмент для этого приложения.
Однако я думаю, что есть способ сделать это при использовании sed; идея состоит в том, чтобы добавить N строк для удержания пространства, пока вы не сможете читать, не нажимая EOF. Когда EOF попал, напечатайте содержимое пространства удержания и закройте.
sed -e '$!{N;N;N;N;N;N;H;}' -e x
Команда sed выше будет опускать последние 5 строк.
Вы можете получить общее количество строк с помощью wc -l <file>
и использовать
head -n <total lines - lines to remove> <file>
Это удалит последние 3 строки из file
:
for i in $(seq 1 3); do sed -i '$d' file; done;