Encontre parte do texto em uma linha e adicione-a a outra parte da mesma linha

Encontre parte do texto em uma linha e adicione-a a outra parte da mesma linha

Eu tenho isto:

Issue #12345: some more text here https://some.domain/some/path

Gostaria de encontrar o bit 12345 (que é dinâmico - portanto, será necessário por meio de uma regex) e adicioná-lo ao final da mesma linha. Igual a:

Issue #12345: some more text here https://some.domain/some/path/12345

Como posso conseguir isso usando sed/awk?

PS: Eu olhei em volta, mas a única pergunta semelhante foi esta:Substituindo parte de uma string por outra parte da mesma string... mas está faltando o bit regex.

Responder1

Supondo que sua entrada esteja em um arquivo test.txt, o seguinte comando deve funcionar

sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g' test.txt

Se você não estiver lendo diretamente de um arquivo,

input_source | sed -E 's/^(.*)([[:digit:]]{5})(.*)$/\1\2\3\/\2/g'

Saída:

Issue #12345: some more text here https://some.domain/some/path/12345

O que o comando faz:

^(.*)Comece no início do arquivo e pegue tudo até a próxima correspondência ([[:digit:]]{5})corresponder aos próximos 5 dígitos (.*)$pegue tudo até o final do arquivo \1\2\3\/\2cada grupo correspondente é numerado (1-3 neste caso) e formatamos a saída para obter o texto original (correspondências 1-3), '/' e depois a segunda correspondência.

Para referência futura, seria ideal se você pudesse descrever seu problema de forma mais concreta. Por exemplo, digamos que você está procurando os primeiros 5 dígitos de uma linha e deseja adicionar esses dígitos (com uma barra anterior) ao final da linha, e fazer isso para cada linha da entrada. Presumi que era isso que você quis dizer. Caso contrário, você pode atualizar sua pergunta para ser mais específico.

Você também pode listar algumas tentativas que fez, em vez de apenas citar perguntas anteriores. Também nos ajuda a ter uma ideia melhor do que você está tentando fazer.

Responder2

sed 's,\([[:digit:]][[:digit:]]*\).*,&/\1,' file

ou, se você sedtiver que -Elidar com expressões regulares estendidas em padrões,

sed -E 's,([[:digit:]]+).*,&/\1,' file

A sedexpressão de substituição encontra o primeiro número inteiro positivo (sequência de dígitos) na linha e o captura. Também corresponde ao resto da linha daquele ponto até o final da linha. A parte de substituição da expressão substitui o bit correspondente da linha por tudo o que foi correspondido ( &) seguido por uma barra e a sequência de dígitos capturada.

Estou usando vírgulas como delimitador na expressão, pois a parte de substituição contém uma barra, mas também poderia ter escrito o comando como

sed -E 's/([[:digit:]]+).*/&\/\1/' file

Os comandos acima realizariam a substituição em todas as linhas de entrada. Para restringi-lo a linhas que começam apenas com string Issue #, use

sed -E '/^Issue #/s,([[:digit:]]+).*,&/\1,' file

Responder3

Eu fiz pelo método abaixo

comando

i=`awk '{print $2}' file.txt| sed "s/^#//g"| sed "s/:$//g"`
awk -v i="$i" '{print $0"/"i}' filetxt

saída

Issue #12345: some more text here https://some.domain/some/path/12345

informação relacionada