Considere este trecho:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* //p')
Quero colocar a última palavra em uma variável se alguma condição de padrão for correspondida para linhas no arquivo de texto arbitrário
Meu problema é que a variável X
possui CR ou LF ou CRLF no final, dependendo do arquivo de origem, do qual quero me livrar, pois interfere nas operações posteriores que pretendo fazer.
Eu até tentei algo como:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* \([A-Za-z]\+\)/\1/p')
portanto, esperamos que a sed
saída seja limitada, [A-Za-z]+
mas ainda existem esses bytes incômodos dentro da variável X.
Como posso me livrar dele, sem usar muita código como ver o que bytes estão no final com xxd
, em seguida, cut
ele e semelhantes complicações?
X
CR
, mas haverá umLF
. Eu tive dificuldade para entender o que você quer da pergunta, espero que minha edição faça o que você quer.grep/sed
soluçãoawk
(o que eu não entendo) e, caso contrário, eu a usarei. GraçasO
``
ou$()
removerá a nova linha do final, mas, para fazer isso programaticamente, usetr
.Isso removerá o retorno de carro e / ou a nova linha da string.
O que pode ser o problema é como você gera o resultado. Por exemplo, por padrão,
echo
adiciona uma nova linha. Você pode querer usarecho -n
ouprintf
.fonte
-m1
irá assegurar que existe apenas uma linha de saída, que com toda a probabilidade, teria o símbolo de retorno no final.tr
... interessante, funciona em arquivos LF e CRLF. Eu pensaria\010\013
por algum motivo, e também\f\r
funciona corretamente. Sobre o resultado: Na verdade, não coloco a saída na variável, mas como variável incluída$()
no padrão paragrep
correspondência -some pipe | grep -o " $(...) "
. Obrigado por comentáriosEu prefiro assim
fonte
Isso funciona para mim:
fonte
Por que não deixar simplesmente
sed
fazer a[\r\f]
limpeza:Sua segunda abordagem não possui um regex final para capturar o CR à direita
\r
,.fonte
A versão normal do grep (incluindo grep -P) sempre gera um feed de linha com sua correspondência, portanto, se você tiver apenas um resultado (ou desejar que o feed de linha adicionado final seja removido), basta remover o caractere final da saída, o que você pode fazer através da canalização
head -c-1
.fonte