Substituir o texto de um número de linha específico usando sed

0

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">
    
por Le Qs 16.11.2016 / 04:00

3 respostas

3

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
    
por steeldriver 16.11.2016 / 04:07
1

Use o seguinte comando:

sed   's/name="AccountSettings"/name="Users"/g' users.html
    
por Jim 29.11.2016 / 19:17
1

Perl

$ 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

$ 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.

Python

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)
  • a idéia principal é redirecionar stdin stream e ler linhas de lá ou fornecer arquivo como argv[1] - primeiro argumento de linha de comando para script
  • Usamos 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

$ ruby -pe '$_=$_.sub(/AccountSettings/,"Users") if $. == 1' input.txt                                                                             
<template name="Users">
AccountSettings
  • Idéia semelhante ao Perl, a opção -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
por Sergiy Kolodyazhnyy 16.06.2017 / 21:05