Рейтинг:1

Как заменить строки в последних n строках нескольких файлов в Linux

флаг vu

Как я могу заменить строки, скажем, в «последних 10 строках» нескольких файлов?

У меня есть около 100 файлов с одинаковым расширением «.txt», и я хотел бы заменить строку «GLN» на «LOO» в последних 10 строках каждого файла. Как мне это сделать? Я знаю, как это сделать для одного файла, но не для нескольких файлов. Когда я использую эту команду ;

для i в `head -3 *.txt | awk '{напечатать $4}'`
     делать
                   sed -i 's/GLN/LOO/g' *.txt 
     сделано

Он заменяет GLN везде, где встречается в файлах, а не только в последних 10 строках. Пожалуйста, что я делаю не так?

Рейтинг:2
флаг hr

не понятно что голова -3 *.txt | awk '{напечатать $4}' возвращается сюда, так как вы не показали нам образцы ваших файлов, однако sed -i 's/GLN/LOO/g' *.txt заменит все экземпляры GLN в все линии в все файлы, соответствующие *.текст, если цикл выполняется хотя бы один раз.

AFAIK нет прямого способа решить последнюю н строки файла в sed - поэтому, чтобы использовать это, вам нужно будет вычислить смещение извне, используя туалет -л и арифметика оболочки, например:

для ф в *.txt; делать 
  start=$(( $(wc -l <"$f") - 9 ))
  sed "$start"',$s/GLN/LOO/g' "$f"
сделано

(я удалил поэтому вывод идет на терминал для тестирования). Вы можете использовать что-то вроде awk 'END{print NR-9}' "$f" на месте $(( $(wc -l <"$f") - 9 )) чтобы получить начальное смещение, если вы намеревались использовать awk.

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

В этой ситуации я, вероятно, потянулся бы к ред. или же бывший которые поддерживают смещения числовых адресов, например. тестирование с выводом на терминал:

для ф в *.txt; делать 
  printf '%s\n' '$-9,$s/GLN/LOO/g' ',p' | ред -с "$f"
сделано

Как только вы будете довольны тем, что все работает правильно, измените ,п к wq к жзаписать результат в файл (эквивалент sed ).

Рейтинг:1
флаг cn

Я бы использовал функции tac и awk для этой работы следующим образом:

так файл1.txt | awk 'NR<11 {gsub("GLN","LOO")};{print}' | так

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.