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\/\2
cada 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ê sed
tiver que -E
lidar com expressões regulares estendidas em padrões,
sed -E 's,([[:digit:]]+).*,&/\1,' file
A sed
expressã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