Как я могу изменить строку, которая содержит 2-й вхождение строки?

Этот пост объясняет, как добавить строку в начале файла из терминала. Но как мне изменить с терминала строку где-то в файле, если я не знаю, какая это строка?

Я должен изменить строку eni=10.*10**9 на eni=10.*10**8, чтобы отметить показатели степени. Это второй раз, когда появляется eni

4
задан 1 September 2019 в 22:20

3 ответа

Я думаю, что это - то, что Вы хотите:

line=$(grep -n -m2 "eni" file | tail -n1 | cut -f1 -d:)

sed -i $line's/9$/8/' file
4
ответ дан 23 November 2019 в 11:42

Так как Ubuntu теперь поставлется с GNU Awk v4.0 + (который обеспечивает inplace модуль), Вы могли сделать что-то как

gawk -i inplace '/eni=/ {if (++c == 2) sub(/10\*\*9/,"10**8")} 1' file

Можно сделать регулярные выражения /eni=/ и/или /10\*\*9/ более или менее конкретный как требуется.

Так же в жемчуге

perl -i -pe 'if (/eni=/) {s/10\*\*9/10\*\*8/ if (++$c == 2)}' file
4
ответ дан 23 November 2019 в 11:42

Используя sed:

sed -i ': 1 ; N ; $!b1 ; s/eni\=10\.\*10\*\*9/eni\=10\.\*10\*\*8/2' filename

/ один из разделителей и \ символ ESC. \ используется так, чтобы удар не интерпретировал специальные символы как некоторую команду, как * как подстановочный знак.

3
ответ дан 23 November 2019 в 11:42

Другие вопросы по тегам:

Похожие вопросы: