Текст замены определенного номера строки с помощью sed

У меня есть файл HTML users.html то, что я хочу заменить первую строку. Первая строка похожа на это

<template name="AccountSettings">

Я хочу, чтобы первая строка читала

<template name="Users">
1
задан 16 November 2016 в 06:28

3 ответа

Команды в sed принимают диапазон адресов . В этом случае, для ограничения замены просто первой строкой диапазон должен быть единственным адресом 1 т.е.

sed '1 s/AccountSettings/Users/' users.html
4
ответ дан 3 December 2019 в 06:24

Использование после команды:

sed   's/name="AccountSettings"/name="Users"/g' users.html
1
ответ дан 3 December 2019 в 06:24

Perl

$ perl -pi -e 's/AccountSettings/Users/ if $. == 1' input.txt
  • -pi позволяет делать изменения для входного файла оперативными, т.е. изменять фактический файл. Если Вы хотите видеть результат прежде, чем перезаписать файл, использовать -p вместо этого
  • s/AccountSettings/Users/ выполните первую замену на шаблон.
  • $. обработанное количество строки

AWK

$ awk 'NR==1{sub("AccountSettings","Users")};1' input.txt                
<template name="Users">
AccountSettings
  • NR==1{sub("AccountSettings","Users")} Pattern or Condition {actions} структура, типичная для awk. Действие выполняется, когда условие верно.
  • NR==1{} количество обработанных строк, конкретно мы смотрим, если количество строк равно 1.
  • sub("AccountSettings","Users") выполняет замену для первого соответствия шаблона.
  • 1 шаблон с опущенным действием. Действие по умолчанию для шаблона, который верен, должно распечатать, и шаблон создания, чтобы быть 1 гарантирует, чтобы мы распечатали получающиеся строки.

Python

Один лайнер с чтением stdin:

$ python -c 'import sys;print("\n".join([ l.strip().replace("AccountSettings","Users") if i==0 else l.strip()  for i,l in enumerate(sys.stdin)]))' < input.txt

Версия сценария:

#!/usr/bin/env python
from sys import argv;
with open(argv[1]) as f:
    for index,line in enumerate(f):
        text = line.strip().replace("AccountSettings","User") if index == 0 else line.strip()
        print(text)
  • центральная идея состоит в том, чтобы или перенаправить stdin поток и считал строки оттуда или обеспечивает файл как argv[1] - первый параметр командной строки к сценарию
  • Мы используем variable = value_1 if condition else value_2 структура для создания списка строк с соответствующими значениями в остроте, в то время как в присвоении версии сценария на text переменная и непосредственная печать той переменной выполняется. Условие для замены является, конечно, номером строки

Ruby

$ ruby -pe '$_=$_.sub(/AccountSettings/,"Users") if $. == 1' input.txt                                                                             
<template name="Users">
AccountSettings
  • Подобная идея Perl, -p переключатель позволяет нам печатать $_ (текущая строка) переменная каждый раз.
  • $_=$_.sub(/AccountSettings/,"Users") if $. == 1 action if condition структура, где мы используем .sub() функция, чтобы выполнить замену шаблона и присвоить его назад $_ буферизуйте, если номер строки равняется 1
2
ответ дан 3 December 2019 в 06:24

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

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