suponha que, se houver um arquivo composto pelas seguintes linhas, se elas estiverem
12345 567 7878 66 er3 t45t y6y46y 4y6 y656y y5y 46y6 65y7 y66uyuy yy46y6y
A saída deve se parecer com:
66. y6y46y y5y y66uyuyy y46y6y
Eu tentei o sed 's/.* //g'
nome do arquivo de comando e vários outros sed
comandos, mas não está funcionando.
Posso saber qual é o sed
comando exato ?
text-processing
sed
awk
Rajeev Nukala
fonte
fonte
sed
?Respostas:
Isso ainda imprimiria uma linha vazia para cada linha em branco. Para evitá-lo:
fonte
sed -n 's/.*[[:blank:]]\+\([^[:blank:]]\+\)[[:blank:]]*$/\1/p'
..*
na cauda - você descarta qualquer coisa, exceto espaços em branco finais de qualquer maneira com.*[^[:blank:]]
.A
awk
variável$NF
é o último campo de cada registro ; você pode usá-lo para imprimir apenas os últimos campos do seu arquivo da seguinte forma:fonte
Podes tentar :
sed 's/.* //'
awk '{print $NF}'
fonte
Você está quase lá. Basta especificar a última palavra:
O que faz:
(Editado para adicionar uma solução melhor. Obrigado Hildred!)
fonte
sed -r 's/.* ([^ ]+)/\1/g'
se expressões regulares estendidas forem permitidas, o que geralmente é o caso.sed 's/.* //'
Você poderia usar algum padrão adequado de, em
grep
vez desed
, por exemplo:Neste exemplo, o
[...]
contém intervalos de caracteres considerados apropriados para uma "palavra" (alfanuméricos, nesse caso, outros símbolos podem ser adicionados, alguns dos quais precisam ser escapados).fonte
a-Z
como um intervalo não faz muito sentido, mesmo em locais baseados em ASCII. Observe que-o
é uma extensão GNU.Se você qualificar palavra para significar qualquer sequência de 1 ou mais caracteres não em branco , a resposta é definitivamente sim, e também é muito simples. Isto porque
[[:blank:]]*
e[^[:blank:]]*
são complementos boolean e - fornecidos todos os caracteres em uma seqüência estão completos -[[:blank:]]*
U[^[:blank:]]*
pode descrever qualquer seqüência possível, da mesma maneira.*
faz.Se um caractere incompleto ou uma sequência de bytes inválida existir em uma sequência, não será possível descrevê-la com êxito da cabeça para a cauda - como às vezes pode ocorrer ao interpretar uma sequência na codificação incorreta. Para garantir um caractere completo por byte em qualquer sequência, o código de idioma C pode ser forçado como:
... o que evitaria quaisquer problemas que descrevessem a corda da cabeça à cauda com um padrão abrangente, como
.*
ou([ ]*[^ ]*)*
Um padrão totalmente complementar pode repetir quantas vezes for necessário, da esquerda para a direita, o comprimento de qualquer string para aterrissar na última ocorrência possível, sem nenhuma interrupção no padrão. Definitivamente, essa é uma linguagem comum.
BRE:
ANTES:
Ambas as versões ainda imprimirão linhas em branco, e isso ocorre porque a
*
estrela Kleene corresponde a zero ou mais ocorrências de um padrão. Primeiro, corresponde a zero ou mais caracteres em branco, zero ou mais caracteres em branco e, em seguida, zero ou mais ocorrências das correspondências agrupadas até corresponder à sequência na íntegra.Tendo correspondido tudo isso, a mágica acontece na substituição - as referências retornadas por grupos
\1
e\2
são as últimas ocorrências de cada uma. Portanto, quando a substituição é feita, toda a cadeia é substituída apenas pela última ocorrência em uma linha de zero ou mais caracteres não em branco - ou do subgrupo\2
.É claro que isso funciona para qualquer sequência possível - mesmo uma vazia - o que significa que os dois formulários imprimirão caracteres de nova linha para linhas que contêm apenas caracteres em branco ou nenhum. Para lidar com isso, há algumas coisas que você pode fazer, mas primeiro vamos facilitar a digitação da classe de personagem:
Agora, para imprimir apenas se uma linha contiver um ou mais caracteres que não estão em branco, você pode:
BRE:
ANTES:
Qualquer um dos formulários funcionará com qualquer um dos métodos - desde que a sintaxe esteja correta.
O
-n
comutador desativa a impressão automática do espaço do padrão e op
sinalizador para os comandoss///
ubstitution ou/
address/
imprime seus resultados somente se for bem-sucedido.Essa mesma lógica pode ser aplicada para obter qualquer
{num}
ocorrência, como:BRE:
ANTES:
... em que os
num
dois regexps podem ser substituídos por um número para imprimir apenas a{num}
ocorrência especificada de uma sequência de caracteres que não estão em branco. Uma forma ligeiramente diferente é usada aqui para garantir que a contagem não seja inclinada para o espaço inicial em uma sequência.Observe que o
-E
switch ERE parased
é suportado nas versões BSD e GNU, embora ainda não seja a sintaxe padrão do POSIX.fonte
sed
(como Solaris / usr / bin / sed) e será mais caro que a abordagem mais simples (esgota a memória com linhas de entrada com mais de 25 caracteres com osed_su3
da caixa de ferramentas do Heirloom, por exemplo). Portanto, apesar de gostar da resposta, não recomendaria essa abordagem.s/.* \([^[:blank:]]\{1,\}\).*/\1/
é muito melhor, mas é mais difícil quando várias linhas estão envolvidas. Outro dia, no entanto, eu descobri que's/\(\n\)*/\1/g;s/\n\(\n.*\)*/&&/[num];s///[samenum]
pode efetivamente sustentar isso. De qualquer forma, contanto que não haja erro evidente na lógica, então eu estou feliz - eu apenas pensei que devia ter perdido alguma coisa.sed
- isso é um pouco estranho - deve parecer de acordo com o padrão. O xrat diz ... Os desenvolvedores de padrão consideraram o comportamento histórico comum, que suportava"\n*"
, mas não"\n\{min,max\}", "\(...\)*"
, ou"\(...\)\{min,max\}"
, como resultado não intencional de uma implementação específica, e suportava expressões de duplicação e intervalo após subexpressões e referências anteriores.( '*' )
ou uma expressão de intervalo (consulte o item (5)), a referência posterior corresponderá à última (mais à direita) ) dessas cadeias. Eu tenho certeza que testei isso comminised
- embora certamente estivesse testando algo estranho comminised
outro dia.Sim. O comando sed a seguir remove primeiro todos os espaços em branco à direita (
s/ *$//
) e depois tudo, inclusive o último espaço em branco (s/.* //
). Provavelmente vale a pena substituir o espaço[[:blank:]]
em branco literal por para capturar guias e outros caracteres semelhantes ao espaço.fonte
fonte