Есть ли команда, которая позволит мне редактировать последние n строк в файле? У меня есть несколько файлов, которые все имеют различное количество строк внутри. Но я хотел бы изменить последние n строк в каждом файле. Цель состоит в том, чтобы заменить запятые точкой с запятой в последних n строках. Но только в самых последних n строках.
Я не хочу удалять какие-либо строки, я просто хочу заменить каждую запятую точкой с запятой в последних n строках в каждом файле.
Используя команду sed, я могу заменить самую последнюю строку этой командой. Как описано здесь: Как я могу удалить текст в последней строке файла?
Но это только позволяет мне изменить самую последнюю строку, а не последние n строк.
text-processing
awk
sed
sku2003
источник
источник
sed '24,$s/,/:/g' filename
где24
стартовая линия`Ответы:
Заменить запятые на точку с запятой в последних n строках
ed
:Разделив это на части:
ed -s
= запустить ed без вывода сообщений (не сообщайте о байтах, написанных в конце)'$-'
= с конца файла ($
) минус ...$((n-1))
= n-1 строк ...$' ... '
= процитировать оставшуюся часть команды, чтобы защитить ее от оболочки),$s/,/;/g
= ... до конца файла (,$
), найдите и замените все запятые точкой с запятой.\nwq
= завершить предыдущую команду, затем сохранить и выйтиЗаменить запятые на точку с запятой в последних n строках
sed
:Разбивая это на части:
-i
= редактировать файл "на месте"$(( ... ))
= сделать немного математики:$( wc -l < input)
= получить количество строк в файле-n + 1
= идти назад n-1 строк,\$
= от n-1 строк до конца файла:s/,/;/g
= заменить запятые точкой с запятой.источник
wc -l < input
наwc -l input
. Должно быть быстрее на несколько наносекунд :)wc -l input
выводит также и имя файла; нам нужен только счетчик строкРешение с использованием tac и sed для замены каждой запятой на точку с запятой в последних 50 строках файла file.txt:
источник
С GNU
head
и Bourne-подобной оболочкой:Мы перезаписываем файл поверх себя. Это нормально здесь транслитерации байт в байт , но не обязательно , если изменение влечет за собой изменение размера файла (в этом случае, вы хотите заменить
1<> file
с> other-file && mv other-file file
, например).источник
1<>
, с которыми я был незнаком. Кроме того,sponge
из moreutils - хороший инструмент для конвейеров, где вы хотите перезаписать свой ввод.Предположим, мы хотим заменить последние
7
строки следующей последовательности сценарием оболочки и реализацией GNUsed
:Шаг 1 : позволяет получить номер последней строки последовательности, как показано ниже. Взгляните на то и это :
Шаг 2 : давайте установим количество строк (в конце последовательности), которые мы намереваемся редактировать:
Шаг 3 : давайте посчитаем начальную строку на основе предыдущих переменных, как показано ниже. Посмотрите на это :
Шаг 4 : Теперь мы можем заменить последние 7 строк последовательности чем-то другим, как показано ниже. Посмотрите на это :
Шаг 4 использует раздел 4.4 man-страницы sed, в котором говорится:
Шаг 4 также использует двойные кавычки, как упомянуто здесь .
Что ж, 4 шага не нужны, если мы используем ответ Гоху так:
источник
Использование
tail
и труба для седа:tail -n 20 file | sed 's/,/;/g'
Это работает с файлом за последние 20 строк. Если вы хотите, чтобы ваши файлы направлялись прямо в файл, используйте:
tail -n 20 file | sed -i 's/,/;/g'
источник