Добавить номера строк к выбранным строкам в sed - PullRequest
0 голосов
/ 15 января 2020

У меня повреждено электронное письмо с тем же именем "priloha" для многих вложений.

--=_6307cd41740728f4463731ed=a0cf2ceb-1b64-55a3-9dc3-738b8e19552b_=
Content-Type: image/jpeg;
name=priloha
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
size=50103;
filename=priloha

tABRRRQB/9k=
--=_6307cd41740728f4463731ed=a0cf2ceb-1b64-55a3-9dc3-738b8e19552b_=
Content-Type: image/jpeg;
name=priloha
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
size=59445;
filename=priloha

Мне нужно добавить к слову "priloha" либо номер строки, либо изменить строки со словом " priloha "таким образом:

name=priloha23
filename=priloha34
name=priloha134
filename=priloha145

и еще много подобных строк, сохраняя при этом строки между ними.

Числа могут быть любыми уникальными идентификаторами, например, номерами строк.

У меня есть следующий рабочий скрипт:

sed 's/\r//g' input.eml >output.eml # dos end of lines into unix ones
for i in {10..50} # cca 30 attachments to procede 
 do
  sed -i "0,/name=priloha$/s//name=priloha$i/"        output.eml
  sed -i "0,/filename=priloha$/s//filename=priloha$i/"  output.eml
 done

Вы, вероятно, признаете, что это немного неуклюже. Можете ли вы дать мне хит, как сделать это за один раз. Примерно так:

sed "/ name = priloha / s / name = priloha / name = priloha [текущая строка #] /" input.eml> output.eml # не работает

Ожидание : найдите строки с "name = priloha", измените его на "name = priloha [текущая строка #]"

Я с нетерпением жду ваших умных идей и заранее благодарю!

Ответы [ 2 ]

1 голос
/ 15 января 2020

Это может сработать для вас (GNU sed):

sed -i '/priloha/=' file && sed -Ei 'N;s/(.*)\n(.*priloha)/\2\1/;P;D' file

Первый вызов sed вставляет номер строки, содержащей слово priloha, в файл. Второй вызов добавляет номер строки к слову priloha.

1 голос
/ 15 января 2020

Не могли бы вы попробовать следующее, если вы в порядке с awk.

awk '{sub(/priloha/,"&"FNR)} 1'  Input_file

Это заменит строку priloha на строку и строку строки и номер строки.

Как только вы будете в порядке с вышеуказанной командой (которая печатает вывод на терминале) и в случае, если вы хотите сохранить вывод в сам файл Input_file.

awk '{sub(/priloha/,"&"FNR)} 1' Input_file > temp && mv temp Input_file
...