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 chamadol
como ponto para mais tarde. -
s///
faz a pesquisa / substituição real no espaço de padrão mencionado acima:-
^\([^\n]\+\)\n
procura 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 em
acima), terminaríamos em um loop infinito citando o mesmo
word
, de novo e de novo - >''''word''''
, porques///
sempre seria bem-sucedido etl;
voltará para:l
(consultetl;
mais abaixo). -
\n
todos 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 chamadol
e 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.