Meu comando sed é,
sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'
Deve retornar,
bcde:cdeaf
(ou seja) todos os caracteres antes do primeiro dois pontos na linha e o próprio dois pontos devem ser removidos.
Mas isso não está removendo nada.
Minha confusão surge principalmente devido a,
1) As parênteses para a correspondência de padrões precisam ser escapadas dentro dos regex-es sed?
2) Nos dois casos (com escape / sem escape), ele não está funcionando. Eu tentei,
sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'
sed 's/[^:]*://'
. E você não estád
excluindo a linha de entrada, a propósito, está modificando-a com ums///
comando de substituição. Você precisa substituir o primeiro bit que não é cólon e o cólon que o segue com nada.printf "%s\n" "${line#*:}"
...while read line
que recebe o$line
, provavelmentesed
deve ser o preferido.Respostas:
O primeiro
^
significa o início da linha. O[^:]
é apenas a única maneira que eu sei como escrever não um cólon . O*
após o cólon significa qualquer número de coisas que estão diante de mim (neste caso, o não-cólon). Finalmente, o:
seleciona o cólon.Em outras palavras, selecione o início da linha, qualquer número de coisas que não sejam dois pontos e o primeiro dois pontos.
Os
//g
meios excluem todas as instâncias correspondentes.fonte
^
ancorar sua correspondência, exceto porque você também adiciona umag
bandeira global. só pode haver uma 1ª ocorrência de um padrão e, portanto, ag
bandeira lobal não remove todos os[^:]*:
padrões de uma linha, como faria se você não o^
ancorasse. em vez de complicar o regex com dois sinalizadores desnecessários que servem apenas para desequilibrar um ao outro, você pode simplesmente excluí-los, que é o que a versão editada desta resposta demonstrou antes de você reverter. por que você insistiria em divulgar informações ruins, eu não sei, mas isso faz uma resposta ruim.sed
habilidades. Eu sou novosed
e ainda não me sinto confortável em me afastar da sintaxe muito limitada que peguei até agora. Issosed
(heh), acho que minha resposta resolve o problema do OP, mesmo que não seja a melhor (ou seja, sua) resposta. Este é o Stack Exchange, não o Wikipedia, então me corrija se eu estiver errado, mas se você souber uma resposta melhor, deve publicá-la para que as pessoas possam ver a variedade de abordagens e compará-las. Por favor, não transforme minha resposta em sua resposta com a função de edição .Para operar com colunas, existe
cut
:o mesmo
E outra versão com
sed
(mais rápido para big data):E bastante exótico em
bash
ou
ou
fonte
sed 's/[^:]*://'