sed s comando não substituindo

1

Este comando sed

echo 'a' | sed 's/a/b/'

saídas

b a

Isso está correto ou deveria estar gerando apenas um b ?

Atualizar

Sou enviado para um Samsung Tab S2 executando Android 6.0.1 com adb shell

uname -a Linux localhost 3.10.9-8374498 #1 SMP PREEMPT Fri Jul 8 14:31:31 KST 2016 armv7l

sed --version This is not GNU sed version 9.0

type sed sed is a tracked alias for /system/bin/sed

    
por sam.is 15.11.2017 / 21:04

3 respostas

2

Eu certamente esperaria que o comando echo 'a' | sed 's/a/b/' imprimisse b por conta própria, e não imprima b a como seu exemplo.

De fato, quando executo esse comando no Android adb shell mais próximo, obtenho o resultado esperado:

$ adb shell
android:/ $ echo 'a' | sed 's/a/b/'
b

Este é um dispositivo diferente do seu (consulte a referência abaixo para versões específicas).

Não consigo pensar no que geraria a saída b a (substituto, espaço, original). Antes de ficar muito profundo, certifique-se de que isso é o que realmente está vendo - digite o comando inteiro exatamente como está escrito, chave por tecla (sem colar).

Se realmente está gerando essa saída, eu só posso imaginar isso vindo de um bug presente no seu sistema. Mas qual bug e onde?

Reduzindo o problema

Primeiro, verifique se o pipeline do seu shell está funcionando conforme o esperado. Tente canalizar um comando simples sem argumentos para outro comando simples sem argumentos, por exemplo env | head .

Se você trocar seu sed por tr a b ou mesmo head , saberá se é especificamente um problema com sed .

Você também pode tentar sed fora do pipeline. Execute sed sozinho como um comando interativo e digite input (como a ) nele. Pressione Ctrl-D quando terminar para sinalizar o fim do arquivo.

Um ambiente de trabalho

O shell é o MirBSD KSH ( mksh ), sed é o comando sed do Toybox.

$ adb shell
android:/ $ sed --version
This is not GNU sed version 9.0
android:/ $ type sed
sed is a tracked alias for /system/bin/sed
android:/ $ ls -l /system/bin/sed
lrwxr-xr-x 1 root shell 6 2009-01-01 17:00 /system/bin/sed -> toybox
$ toybox --version
0.7.0-a324bde36bd6-android
$ echo $KSH_VERSION
@(#)MIRBSD KSH R52 2016/01/20
    
por 16.11.2017 / 02:33
0

nota: outras respostas são bem-vindas (não aceitarei isso)

Eu tinha o seguinte arquivo config que queria definir tls=true

ip=192.168.1.1
port=08
tls=false

Minha solução alternativa foi a seguinte (somente funciona com configuração b / c na parte final de config )

tls=$(sed -n '/false/p' config)
sed -i '/false/d' config
echo ${tls/false/true} >> config
    
por 15.11.2017 / 23:17
-1
we can do it by awk 

echo "a" | awk '{gsub("a","b",$1);print $1}'
b
    
por 16.11.2017 / 03:10

Tags