Ответ 1
sed -e "$ ! s/a/b/"
Это будет соответствовать каждой строке, кроме последней. Подтверждено быстрым тестом!
Вы можете указать диапазон строк для работы. Например, для работы со всеми строками (что, конечно, по умолчанию):
sed -e "1,$ s/a/b/"
Но мне нужно работать на всех, кроме последней строки. Вы, по-видимому, не можете использовать арифметические выражения:
sed -e "1,$-1 s/a/b/"
(я использую cygwin в этом случае, если это имеет значение)
sed -e "$ ! s/a/b/"
Это будет соответствовать каждой строке, кроме последней. Подтверждено быстрым тестом!
Эта команда работает тоже
sed '$d'
Я знаю, что это не sed
, но я чувствую, что head
получает самый простой и гибкий способ:
head -n -1 the-file
Используйте -2, -3... вместо -1, чтобы получить все, кроме двух последних строк, и т.д.
Хорошо, вы могли бы взломать его примерно так:
sed -e "1,$(($(cat the-file | wc -l) - 1))s/a/b/"
Или вы можете использовать tail
вместо этого:
(tail +1 the-file) | sed -e s/a/b/; tail -1 the-file
В более общем смысле эта проблема требует, чтобы вы отредактировали поток, указав диапазон с одним из пределов диапазона, являющимся смещением от конца файла. В следующем примере показано, как это сделать. В этом примере я печатаю все строки файла, начиная с 5-й строки из последней строки и заканчивая последней строкой. В вашем случае вы можете установить OFFSET = -1
вместо OFFSET = -5
.
(( OFFSET = -5 )); (( N1 = $(cat pgen.c | wc -l) + OFFSET )); sed -n "$N1,\$p" thefile
Эта команда может быть введена в одну строку.