Digamos que eu tenha a seguinte string de exemplo:
<ETH0_IP><![CDATA[10.0.100.10]]></ETH0_IP>
Gostaria de extrair o primeiro número e o IP no seguinte formato:
0 10.0.100.10
Eu sei como extrair o primeiro ( sed 's@^[^0-255]*\([0-255]\+\).*@\1@'
) número e IPs ( grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
), mas um de cada vez e eu queria saber se consigo em apenas uma linha
Substitua todos os caracteres que não são dígitos (e não ".") por espaços e, em seguida, você pode imprimir a primeira e a segunda colunas:
resultado:
ps: você tem que torná-lo mais sofisticado se tiver "." em outros lugares e não apenas nos PIs.
Se você quiser todos os números (inteiros) e todos os endereços IP(v4), adicione uma alternância ao regex com grep:
Isso imprimiria os valores um por linha e, é claro, também pegaria o
0
doETH0
final.Se você quiser apenas o número e o IP das linhas de entrada que contêm uma estrutura semelhante à acima (e nenhuma outra), você pode usar, por exemplo, sed:
\1
e\2
correspondem ao primeiro e segundo grupo entre parênteses, e eu combinei o IP com apenas[0-9.]+
aqui para clareza e preguiça.ou similarmente em Perl:
Usando
xq
(de https://kislyuk.github.io/yq/ ), e assumindo que a entrada é literalmente o único nó XML da pergunta:Isso converte o documento XML em JSON e, em seguida, extrai o restante do nome da tag removendo
ETH
do início e_IP
do fim. O endereço IP também é extraído e os dois valores resultantes são emitidos como uma lista delimitada por tabulação.As chamadas
ltrimstr()
ertrimstr()
poderiam ser substituídas porgsub("[^[:digit:]]"; ""))
ougsub("\\D"; ""))
, o que excluiria todos os não dígitos do nome da tag.O documento JSON intermediário ficaria assim
... e a saída seria no final