Eu tenho este arquivo de entrada:
...
https://long-url/something?value1=999&something=xyz?value2=555
https://long-url/something?value1=534&something=xyz?value2=2312
https://long-url/something?value1=534&something=xyz?value2=233
https://long-url/something?value1=534
...
Eu quero capturar o valor1 e o valor2 e produzi-los como csv e descartar todas as linhas que não correspondem:
...
999,555
534,2312
534,233
...
Não tenho problemas em capturar os valores, mas estou tendo problemas para remover linhas indesejadas:
sed 's/.*categoryid=\([0-9]*\).*courseid=\([0-9]*\).*/\1,\2/g;/^[^0-9]\+/d' input-file
Basicamente, o /^[^0-9]\+/d
não está funcionando como pretendido. Eu estava pensando que removeria todas as linhas que não começassem com nenhum dígito, mas, em vez disso, me deu:
999,555
534,2312
534,233
Minha versão sed:sed (GNU sed) 4.7
Sua expressão,
^[^0-9]\+
, força a correspondência de pelo menos um não dígito, o que significa que linhas vazias não corresponderão, pois não contêm não dígitos.Pessoalmente, eu faria isso da seguinte maneira:
Isso primeiro exclui todas as linhas que não correspondem à sua expressão regular específica (por exemplo, linhas vazias). A segunda expressão realiza a substituição. Quando um padrão vazio é usado (como na substituição na segunda expressão), o padrão usado mais recentemente é reutilizado.
Observe que você não precisa
/g
no final do comando de substituição, pois só espera corresponder ao padrão uma vez por linha de entrada.Você está usando um substituto , seguido por uma exclusão :
Isso é um pouco volátil, porque você
/.../d
pode acidentalmente corresponder a outra coisa no conteúdo do arquivo.Em vez disso, eu imprimiria apenas as linhas que foram afetadas pelo substituto. Isso pode ser feito com
-n
(para evitar a impressão por padrão) e, em seguida, adicionandop
ao final da linha para imprimir as linhas correspondentes. Isso evita a necessidade de uma segundased
declaração.Eu também removeria o final,
g
pois você não precisa de mais de uma correspondência por linha:O resultado é:
Em ação:
saídas
Para corresponder
/^[^0-9]\+/
, a linha deve conter pelo menos um caractere, ou seja, não pode estar vazia.Apenas não remova as linhas que começam com um dígito: