Como obter strings de linha com início e fim de palavra especiais? [duplicado]

0

Aqui está o arquivo strings.xml que inclui 3 sentenças:

1.string name="schedulelist_nofiles" > Não existe agenda de registro! Por favor,

aqui está faltando a linha tecla “Adicionar” (Adicionar) para adicionar uma. string

2.Você deve pular esta linha!

3. nome da string="Programme_name" > string GUIA DE PROGRAMA

Eu uso o comando cat 'cat strings.xml | grep "string name=" mas só fica abaixo das linhas:

string name="schedulelist_nofiles" > Não existe agenda de registro! Por favor,

string name="Programme_name" > string GUIA DE PROGRAMA

Eu quero obter a linha completa como esta, assim como a frase 3, comece com 'string name' e termine com "string". O que posso fazer por isso?

    
por Huang 17.01.2018 / 08:28

3 respostas

0

Abaixo, o sed oneliner pode ser usado para conseguir o mesmo. Testado funcionou bem

Primeiro método1

sed -n '/^string name.*string$/p'  filename

No método1 Ele procura pela linha que começa com "nome da string" e termina com "string"

Método 2

sed -n '/^string name/p' filename | sed -n '/string$/p'

Em method2 Primeiro, ele procura pela linha que começa com "string name" e depois procura pela linha que termina com string

Saída

string name="Programme_name">GUIA DE PROGRAMA string
    
por 17.01.2018 / 13:56
0

Com sed , assumindo que string name= ... string ocupe linhas completas e que todos os string name= s sejam finalizados por string :

sed '
  /^string name=/!d
  :1
  / string$/!{
    N
    b1
  }' < strings.xml
    
por 17.01.2018 / 09:31
0

com pcregrep :

pcregrep -Mo '(?s)\bstring name=.*?\bstring\b' < file.xml
  • -M : modo multi-linha onde pcregrep extrai mais linhas da entrada conforme necessário para satisfazer o regex
  • -o : imprime a parte que corresponde ao regexp como no GNU grep (você pode omitir ou substituir por -x se a regex corresponder a linhas inteiras.
  • (?s) : ative o sinal s que faz com que . também corresponda à nova linha
  • .*? : versão não voraz de .* : qualquer número de caracteres, o mínimo possível.
  • \b : limite de palavras.

Se você não tem pcregrep , pode fazer o mesmo com perl com algo como:

perl -l -0777 -ne 'print for /\bstring name=.*?\bstring\b/gs' < file.xml

Embora isso signifique carregar o arquivo inteiro na memória.

    
por 17.01.2018 / 08:48

Tags