Ответы:
Просто sed
без труб:
sed '1d;$d' file.txt
НОТА
1
средняя первая строкаd
значит удалить;
разделитель для 2 команд$
средняя последняя строкаВам не нужно знать количество строк заранее. tail
и head
может принимать смещение от начала или конца файла соответственно.
Этот канал начинается со второй строки файла (пропускается первая строка) и заканчивается последней, кроме одной (пропускается последняя строка). Чтобы пропустить более одной строки в начале или конце, отрегулируйте числа соответствующим образом.
tail -n +2 file.txt | head -n -1
делая наоборот, работает так же, конечно:
head -n -1 file.txt | tail -n +2
Вот как это сделать awk
:
awk 'NR>2 {print t} {t=$0}'
Также еще один способ для sed
:
sed '1d;x' file.txt
x
Это расширенная sed
команда, она переключает текущую строку с предыдущей: текущая попадает в буфер, а предыдущая - на экран и т. д. при sed
обработке потока строка за строкой (поэтому первая строка будет пустой).
awk
Решение на каждом шаге (строке) помещает текущую строку в переменную и начинает печатать ее только после того, как вторая строка пройдена. Таким образом, мы получили дерьмовую последовательность строк на экране от второго до последнего, кроме одного. Последняя строка не указана, поскольку строка находится в переменной и должна быть напечатана только на следующем шаге, но все шаги уже завершены, и мы никогда не видим строку на экране.
Та же идея в perl
:
perl -ne 'print $t if $.>2 ; $t=$_' file.txt
$.
обозначает номер строки и $_
текущую строку.
perl -n
это ярлык для while(<..>) {..}
структуры и -e
для встроенного скрипта.
В Python я бы так и сделал.
#!/usr/bin/python3
import re
import sys
file = sys.argv[1]
with open(file, 'r') as f:
L = []
for line in f:
line = re.sub(r'\n', r'', line)
L.append(line)
print('\n'.join(L[1:-1]))
Вставьте приведенный выше код в файл и назовите его как script.py
. Запустите скрипт для файла, который вы хотите проверить.
python3 script.py /path/to/the/file
Пример:
$ cat file
foo
apple
banana
bar
$ python3 script.py file
apple
banana
Для пользователей Mac:
На Mac head -n -1
не работает. Вместо этого переверните файл, отрежьте первую строку, а затем переверните ее обратно:
tail -r file.txt | tail -n +2 | tail -r
Объяснение:
tail -r
: меняет порядок строк на входе
tail -n +2
: печатает все строки, начиная со второй строки в своем вводе
head -n -1
удаляет первую И последнюю строку моего.txt
файла в Ubuntu 14.04.2LTS.