Os comandos em sed
aceitam um intervalo de endereços . Nesse caso, para limitar a substituição apenas à primeira linha, o intervalo deve ser o único endereço 1
, ou seja,
sed '1 s/AccountSettings/Users/' users.html
Eu tenho um arquivo html users.html
que eu quero substituir a primeira linha. A primeira linha parece com isso
<template name="AccountSettings">
Eu quero que a primeira linha leia
<template name="Users">
Os comandos em sed
aceitam um intervalo de endereços . Nesse caso, para limitar a substituição apenas à primeira linha, o intervalo deve ser o único endereço 1
, ou seja,
sed '1 s/AccountSettings/Users/' users.html
Use o seguinte comando:
sed 's/name="AccountSettings"/name="Users"/g' users.html
$ perl -pi -e 's/AccountSettings/Users/ if $. == 1' input.txt
-pi
permite fazer alterações no arquivo de entrada no local, ou seja, alterar o arquivo real. Se você quiser ver o resultado antes de sobrescrever o arquivo, use -p
s/AccountSettings/Users/
executa a primeira substituição por padrão. $.
é a contagem de linhas processadas $ awk 'NR==1{sub("AccountSettings","Users")};1' input.txt
<template name="Users">
AccountSettings
NR==1{sub("AccountSettings","Users")}
é Pattern or Condition {actions}
estrutura típica do awk. A ação é executada quando a condição é verdadeira. NR==1{}
é o número de linhas processadas, especificamente, estamos procurando se o número de linhas for igual a 1. sub("AccountSettings","Users")
realiza a substituição para a primeira correspondência do padrão. 1
é padrão com ação omitida. A ação padrão para o padrão que é true é imprimir, e tornar o padrão em 1
garante a impressão das linhas resultantes. Um forro com leitura de 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
Versão do script:
#!/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
stream e ler linhas de lá ou fornecer arquivo como argv[1]
- primeiro argumento de linha de comando para script variable = value_1 if condition else value_2
structure para criar uma lista de linhas com valores apropriados em uma linha, enquanto na atribuição de versão de script à variável text
e a impressão imediata dessa variável é executada. A condição para a substituição é, obviamente, o número da linha $ ruby -pe '$_=$_.sub(/AccountSettings/,"Users") if $. == 1' input.txt
<template name="Users">
AccountSettings
-p
nos permite imprimir a variável $_
(linha atual) a cada vez. $_=$_.sub(/AccountSettings/,"Users") if $. == 1
é action if condition
structure, onde usamos a função .sub()
para executar o padrão
substituição e atribuí-lo de volta a $_
buffer se o número da linha for 1