Isso foi difícil. Supondo que você tenha um file assim:
$ cat file
word
line with a word and words and wording wordy words.
Onde:
- Linha 1: é o padrão de pesquisa que deve ser mantido no espaço de espera e cotado para
'word'. - Linha 2: é a linha para pesquisar e substituir globalmente.
O comando sed :
sed -n '1h; 2{x;G;:l;s/^\([^\n]\+\)\n\(.*[^']\)\([^']\)/\n''/;tl;p}' file
Explicação :
-
1h;salve a primeira linha no espaço de espera (isso é esperar que queremos procurar).-
O espaço de retenção
- contém:
word
- contém:
-
2{...}aplica-se à segunda linha. -
x;troca o espaço padrão e o espaço de espera. -
G;acrescenta o espaço de espera ao espaço do padrão. No espaço de padrões que temos agora:
word # I will call this line the "pattern line" from now on
line with a word and words and wording wordy words.
-
:l;definiu um rótulo chamadolcomo ponto para mais tarde. -
s///faz a pesquisa / substituição real no espaço de padrão mencionado acima:-
^\([^\n]\+\)\nprocura na "linha de padrão" para todos os caracteres (desde o início da linha^) que não são uma nova linha[^\n](uma ou mais vezes\+), até uma nova linha\n. Agora isso é armazenado na referência de referência. Contém a "linha padrão". -
(.*[^'])procura por qualquer caractere.*seguido por um caractere, que não é um[^']do backtick. Isso é armazenado em.contém agora:line with a word and words and wording wordy, até a última ocorrência deword, porque ... -
é o próximo termo de pesquisa (a referência de referência,word), portanto, o que a "linha padrão" contém. -
([^'])isto é seguido por outro caracter que não é um backtick; salvo para fazer referência a. Se não fizermos isso (e a parte emacima), terminaríamos em um loop infinito citando o mesmoword, de novo e de novo - >''''word'''', porques///sempre seria bem-sucedido etl;voltará para:l(consultetl;mais abaixo). -
\ntodos os itens acima são substituídos pelas referências anteriores. O segundo\ 3é o que devemos citar (note que a primeira referência é a "linha padrão").
-
-
tl;se os///foi bem-sucedido (substituímos algo) pula para o rótulo chamadole começa novamente até que não haja mais nada para pesquisar e substituir. Este é o caso, quando todas as ocorrências de palavras são substituídas / citadas. -
p;quando tudo estiver pronto, imprima a linha alterada (espaço padrão).
A saída:
$ sed -n '1h; 2{x;G;:l;s/^\([^\n]\+\)\n\(.*[^']\)\([^']\)/\n''/;tl;p}' file
word
line with a 'word' and 'word's and 'word'ing 'word'y 'word's.