Диапазон Sed Line, все кроме последней строки - PullRequest
26 голосов
/ 04 июня 2009

Вы можете указать диапазон линий для работы. Например, для работы со всеми строками (что, конечно, по умолчанию):

sed -e "1,$ s/a/b/"

Но мне нужно оперировать всеми, кроме последней строки. Вы, очевидно, не можете использовать арифметические выражения:

sed -e "1,$-1 s/a/b/"

(я использую Cygwin в этом случае, если это имеет значение)

Ответы [ 5 ]

46 голосов
/ 04 июня 2009
sed -e "$ ! s/a/b/"

Это будет соответствовать каждой строке, кроме последней. Подтверждено быстрой проверкой!

14 голосов
/ 29 июля 2010

Эта команда тоже работает

sed '$d'
3 голосов
/ 08 августа 2016

Я знаю, что это не sed, но я чувствую, что head получает самый простой и гибкий способ:

head -n -1 the-file

Используйте -2, -3 ... вместо -1, чтобы получить все, кроме последних двух строк и т. Д.

1 голос
/ 04 июня 2009

Ну, вы можете взломать это примерно так:

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
0 голосов
/ 21 мая 2014

В более общем смысле для решения этой проблемы необходимо отредактировать поток, указав диапазон, в котором один из пределов диапазона является смещением относительно конца файла. В следующем примере показано, как это сделать. В этом примере я распечатываю все строки файла, начиная с 5-й строки из последней строки и заканчивая последней строкой. В вашем случае вы можете установить OFFSET = -1 вместо OFFSET = -5.

(( OFFSET = -5 )); (( N1 = $(cat pgen.c | wc -l) + OFFSET )); sed -n "$N1,\$p" thefile

Эта команда может быть введена в одну строку.

...