Como substituir a terceira ocorrência da sequência no arquivo usando o sed
comando
Exemplo:
Altere apenas a terceira ocorrência de is
para us
no arquivo.
Meu arquivo de entrada contém:
hai this is linux.
hai this is unix.
hai this is mac.
hai this is unchanged.
Estou esperando saída é:
hai this is linux.
hai thus is unix.
hai this is mac.
hai this is unchanged.
text-processing
sed
perl
Sureshkumar
fonte
fonte
sed
não é a ferramenta certa para o trabalho.Respostas:
É muito mais fácil fazer isso
perl
.Para alterar o 3 rd ocorrência:
Para alterar a cada 3ª ocorrência:
fonte
Quando a sequência de substituição ocorre apenas uma vez por linha, você pode combinar diferentes utilitários.
Quando a entrada está no arquivo "input" e você está substituindo "is" por "us", você pode usar
fonte
is
por linha.O script abaixo (usando a sintaxe GNU
sed
) é utilizável para edição no local e não para saída, pois interrompe as linhas de impressão após a substituição desejada:Se sua decisão como choroba você pode modificar acima para
que gera todas as linhas
Ou você deve colocar todas as linhas no espaço do padrão (na memória, tenha cuidado com a limitação de tamanho) e faça a substituição
fonte
Você pode usar
sed
isso se anteriormente as novas linhas forem substituídas por outros caracteres, por exemplo:E o mesmo com puro (GNU)
sed
:(
sed
substituição da nova linha roubada descaradamente de /programming//a/1252191/4488514 )fonte
sed
sintaxe específica do GNU , poderá usá-losed -z 's/is/us/3'
.-z
deve ser um novo recurso, o meuGNU sed version 4.2.1
não sabe nada sobre essa opção.\x0
etapa.Essa parte
sed
carrega apenas um registro deis
ocorrências de uma linha para a seguinte. Ele deve manipular confiavelmente o número deis
es por linha que você lançar nela, e não precisa armazenar em buffer as linhas antigas enquanto o faz - apenas retém um único caractere de nova linha para cada umis
que encontrar que não faça parte de outra palavra.O resultado é que ele modificará apenas a terceira ocorrência em um arquivo - e contará por linha. Portanto, se um arquivo se parecer com:
... será impresso ...
Primeiro ele lida com casos de borda, inserindo um espaço na cabeça e no final de cada linha. Isso facilita a verificação dos limites das palavras.
A seguir, procura
is
es válidas inserindo uma\n
linha de e-mail antes que todas as ocorrênciasis
precedam imediatamente zero ou um caractere de pontuação, seguidos por um espaço. Ele faz outra passagem e remove todas as\n
linhas de ew que são imediatamente precedidas por um caractere não espaço. Esses marcadores deixados para trás corresponderãois.
eis
mas nãothis
ou?is
.Em seguida, ele reúne cada marcador
\ni
no final da sequência - para cada partida em uma linha, ele anexa uma linha de\n
ew ao final da sequência e o substitui por umi
ouu
. Se houver três\n
linhas de linha seguidas no final da corda, ele usará o u - senão o i. A primeira vez que au é usada também é a última - a substituição desencadeia um loop infinito que se resume aget line, print line, get line, print line,
e assim por diante.No final de cada ciclo de loop de tentativa, limpa os espaços inseridos, imprime apenas até a primeira nova linha que ocorrer no espaço do padrão e continua novamente.
Vou adicionar um
l
comando ook na cabeça do loop, como:... e dê uma olhada no que faz, pois funciona com esta entrada:
... então aqui está o que ele faz:
Faz mais sentido, talvez com mais
is
es por linha:Isso é praticamente a mesma coisa, mas escrito com POSIX BRE e manipulação rudimentar de argumentos.
... fica ...
... e se eu ativar
${dbg}
:... podemos assistir iterar ...
fonte
Aqui está uma solução lógica que usa
sed
etr
deve ser escrita em um script para que funcione. O código abaixo substitui cada terceira ocorrência da palavra especificada nosed
comando. Substituai=3
pori=n
para fazer isso funcionar para qualquer umn
.Código:
Por que isso funciona:
Suponha que o arquivo de texto seja
a b b b b a c a d a b b b a b e b z b s b a b
.Quando n = 2: queremos substituir cada segundo ocorrência de
b
.a b b b b a c a d a b b b a b e b z b s b a b
. . ^ . ^ . . . . . . ^ . . ^ . . . ^ . ^ . ^
Quando n = 3: queremos substituir cada terceira ocorrência de
b
.a b b b b a c a d a b b b a b e b z b s b a b
. . . ^ . . . . . . . ^ . . . . ^ . . . . . ^
Quando n = 4: queremos substituir cada terceira ocorrência de
b
.fonte