Como faço para excluir a correspondência e alterar apenas um caractere específico com sed

0

Estou tentando usar sed para substituir '0' pela palavra 'correto' (estou usando echo $? para validar meu script e quero substituir a saída de echo ). O problema é que eu tenho mais texto no arquivo de saída e sed está substituindo tudo e não apenas "0".

Por exemplo:

some command
echo ''date' '>> "file"
echo $? >> "file"
sed -i 's/0/correct/g' /"file"

Alguma idéia de como eu poderia conseguir isso funcionar?

EDIT 1 13.02.2014

A saída de echo $? é "0" (o que eu sei é que 0 significa que tudo está OK).

A próxima coisa é que sed -i 's/0/correct/g' /"file" (eu acabei de usar "" porque alguém pode interpretá-lo erroneamente com um nome específico).

Aqui está parte do script:

echo 'date' | cat >> /file.txt
echo $? | cat >> /file.txt
sed -i 's/0/correct/g' /file.txt

-i significa:

   text   Insert text, which has each embedded newline preceded by a back‐slash.
    
por user299930 13.02.2014 / 19:59

3 respostas

1

Do seu snippet de código, a expressão sed parece correta - ela substituirá todos os caracteres '0' pelos caracteres 'corretos'. Se você somente quiser que a saída do comando echo seja atualizada, você pode colocar o comando sed na saída de echo , por exemplo:

some command
date >> /file.txt
echo $? | sed 's/0/correct/' >> /file.txt

(note que os comandos 'echo' e 'cat' não terão efeito na saída)

No contexto em que você está usando a opção -i , na verdade é uma opção de linha de comando, em vez de um comando de script sed - é uma seção diferente na página man :

       -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if extension supplied)

Isso significa que ele atualizará o arquivo de origem (que é exatamente o que você deseja no seu exemplo).

No entanto, observe que neste exemplo, o código de saída que está sendo verificado é o código de saída de date e não o seu comando. De fato, no seu exemplo, ele está verificando o código de saída de echo , que eu suspeito ser ainda menos útil para você.

Uma maneira mais padrão de realizar essa verificação seria nos seguintes termos:

some command
result=$?
date >> /file.txt
if [ $result -eq 0 ]
then
  echo "Command finished successfully" >> /file.txt
else
  echo "Command failed with exit code $result" >> /file.txt
fi
    
por 13.02.2014 / 20:15
0

Se você deseja substituir apenas as linhas que contêm '0' e nada mais, use:

sed -i 's/^0$/correct/g' file.txt

Em que ^ e $ são caracteres especiais que indicam o início e o fim da linha, respectivamente.

Um possível problema poderia ocorrer se houvesse outras linhas no arquivo contendo apenas '0', não apenas os valores $? de retorno. Uma maneira de melhorar isso seria imprimir mais do que apenas $? :

echo RETVAL: $?

Depois, corresponde a essa string:

sed -i 's/^RETVAL: 0$/correct/g' file.txt
    
por 13.02.2014 / 20:56
0

Se você realmente não precisa pesquisar o arquivo de saída e fazer alterações nele, então seria mais fácil simplesmente alterar o que você escreve para ele em primeiro lugar.

Com esse script, se o comando for bem-sucedido e retornar um código de saída de "0" , então "correct" será gravado em seu arquivo: "/file.txt" . Se o comando retornar qualquer outro código de saída, esse código de saída (número) será gravado em seu arquivo.

some command
r=$?
[ $r -eq 0 ] && r="correct"
echo "'date' $r" >> /file.txt

Nota: isto produzirá a data e a sua mensagem ("correta") na mesma linha, que você pode ter desejado. Se você quisesse a data em uma linha e sua mensagem em sua própria linha, altere-a para ser dois comandos de eco como:

some command
r=$?
[ $r -eq 0 ] && r="correct"
echo 'date' >> /file.txt
echo $r >> /file.txt

Existem (pelo menos) duas outras possibilidades que você pode estar tentando realizar:

Primeiro, se você somente deseja gravar no arquivo se o comando for bem-sucedido (retorna um código de saída de "0" ). Isto irá escrever "correct" no seu arquivo em caso de sucesso, mas caso contrário, se qualquer outro código de saída for retornado, então nada será gravado em seu arquivo:

some command
[ $? -eq 0 ] && echo "'date' correct" >> /file.txt

Ou, se você quiser identificar todos os códigos de saída em que um código de saída de "0" é igual a "correto" e qualquer outro código de saída é igual a "erro", então:

some command
r=$?
if [ $r -eq 0 ]; then
    r="correct"
else
    r="error: exit code $r"
fi
echo "'date' $r" >> /file.txt
    
por 13.02.2014 / 22:36