No seguinte arquivo:
Lorem ipsum dolor sente-se no meio, consectetuer adipiscing elit. Ut eu metus id lectus vestibulum ultrices. Mecenas rhoncus.
Quero excluir tudo antes consectetuer
e depois elit
.
Minha saída desejada:
consectetuer adipiscing elit.
Como posso fazer isso?
shell-script
text-processing
manuel
fonte
fonte
sed
. Também pode serperl
, ou até pura festa.Respostas:
Eu usaria sed
Decodificou o sed s / find / replace / syntax:
s/^.*
- substituto começando no início da linha (^
) seguido por qualquer coisa (.*
) até ...\(
- inicia um bloco nomeadoconsectetuer.*elit\.
- corresponda à primeira palavra, tudo (.*
) até a última palavra (neste caso, incluindo o ponto final (escapado)) que você deseja corresponder\)
- finalize o bloco nomeado.*
) até o final da linha ($
)/
- finalize a seção de localização substituta\1
- substitua pelo bloco de nome entre o\(
e o\)
acima/
- finalize a substituiçãofonte
^
ou,$
já que o sed tentará encontrar a correspondência mais longa. Além disso, você pode ter perdido o ponto depoiselit
, pode inserir\.
se necessário.^
e$
não são necessárias - Deixei-os lá para que o entrevistador observou (originalmente) que ele foi um pouco de um novato e esta pode ser útil em outros contextos.Se todas as linhas contiverem padrão inicial e final, é a maneira mais fácil de fazer isso
grep
. Em vez de excluir o início e o final de cada linha, você pode simplesmente exibir o conteúdo entre os dois padrões. A-o
opção no GNUgrep
gera apenas as correspondências:Nota: como mencionado, isso só funciona se todas as linhas no arquivo puderem ser analisadas dessa maneira. Então, novamente, isso representa 80% de todos os casos de uso típicos.
fonte
Dois para loops no AWK:
Gsub do AWK:
fonte
Um jeito Perl. Isto é essencialmente o mesmo que a
sed
resposta de MikeV :O
-p
meio "imprime todas as linhas após aplicar o script fornecido com-e
". Os/foo/bar/
é o operador de substituição; ele será substituídofoo
porbar
. Os parênteses capturam um padrão e vamos usá-lo na substituição. O primeiro padrão capturado é$1
o segundo$2
e assim por diante.Portanto, o comando corresponderá tudo até
consectetuer
(.*consectetuer
), tudo atéelit
(.*elit
) e todo o resto até o final da linha (.*
) e o substituirá pelo padrão capturado.fonte
Não sei por que esse título da pergunta foi editado " do arquivo " para " de uma linha ", enquanto o OP não exclui a possibilidade em várias linhas, mesmo que o exemplo pareça ser apenas uma linha. Seja como for, pode ser útil fornecer uma solução de várias linhas aqui.
Isso funciona para linhas cruzadas:
Exemplos:
Referência: Expansão de Parâmetro do Shell
fonte