У меня есть файл HTML users.html
то, что я хочу заменить первую строку. Первая строка похожа на это
<template name="AccountSettings">
Я хочу, чтобы первая строка читала
<template name="Users">
Команды в sed
принимают диапазон адресов . В этом случае, для ограничения замены просто первой строкой диапазон должен быть единственным адресом 1
т.е.
sed '1 s/AccountSettings/Users/' users.html
Использование после команды:
sed 's/name="AccountSettings"/name="Users"/g' users.html
$ perl -pi -e 's/AccountSettings/Users/ if $. == 1' input.txt
-pi
позволяет делать изменения для входного файла оперативными, т.е. изменять фактический файл. Если Вы хотите видеть результат прежде, чем перезаписать файл, использовать -p
вместо этогоs/AccountSettings/Users/
выполните первую замену на шаблон.$.
обработанное количество строки$ 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
гарантирует, чтобы мы распечатали получающиеся строки.Один лайнер с чтением 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 -pe '$_=$_.sub(/AccountSettings/,"Users") if $. == 1' input.txt
<template name="Users">
AccountSettings
-p
переключатель позволяет нам печатать $_
(текущая строка) переменная каждый раз.$_=$_.sub(/AccountSettings/,"Users") if $. == 1
action if condition
структура, где мы используем .sub()
функция, чтобы выполнить замену шаблона и присвоить его назад $_
буферизуйте, если номер строки равняется 1