Por que o 'sed' não retorna o status de saída se o regex não coincide?

6

Estou tentando pesquisar e substituir algumas linhas de arquivos, mas quando executo sed se essa regex não corresponder, então sed não retorna nenhum código de status. Então, em vez de adicionar mais uma condição com grep , há caminho em sed e por que sed não retorna status de saída?

Problema:

    
por Rahul Patil 25.08.2013 / 16:44

2 respostas

13

sed faz retornar um status de saída:

$ echo "foo" | sed 's/xx/yy/'
foo
$ echo $?
0
$ sed 's/xx/yy/' foo.txt
sed: can't read foo.txt: No such file or directory
$ echo $?
2

Os códigos de saída do Sed são sobre se o programa foi bem-sucedido ou não, eles não têm nada a ver com os componentes internos do que o sed está fazendo, apenas se o comando foi ou não executado.

Dito isso, o GNU sed oferece uma maneira de fazer isso:

   q [exit-code]
          Immediately  quit  the sed script without pro‐
          cessing any more input, except that  if  auto-
          print  is  not  disabled  the  current pattern
          space will be printed.  The exit code argument
          is a GNU extension.

Por exemplo, (tirado de aqui ):

$  echo "foo"|sed '/foo/ s/f/b/;q'                                                                       
boo
$  echo $?
0
$ echo "trash"|sed  '/foo/{s/f/b/;q}; /foo/!{q100}'
trash
$  echo $?
100

Se você quisesse relatar o fato de que qualquer qualquer substituição foi bem-sucedida em qualquer linha da entrada, você poderia sinalizar substituições bem-sucedidas no espaço de espera e verificá-la na última linha:

seq 6 | sed 's/4/four/;s/5/five/; tm;${x;/1/{x;q};x;q1};b;:m;x;s/.*/1/;x'

tm ramifica para o rótulo m se qualquer substituição foi bem-sucedida. Lá, colocamos 1 no espaço de espera, que procuramos na última linha.

    
por 25.08.2013 / 17:14
5

Primeiro, todos os comandos, incluindo sed , retornam um status de saída. Você está procurando por que eu não estaria retornando um fracasso. O que leva ao segundo ponto.

Programas como sed são editores, não predicados. Eles estão lá para alterar os dados que passam pelo programa. As condições de erro são para condições como comandos internos inválidos ou um arquivo inexistente na linha de comando.

Não tenho certeza de qual lógica você quer - você não inclui nenhuma saída esperada - mas isso pode ser o que você está procurando:

$ sed '/^test line 7/s//#test line 7/;/^#test line 7/s//& \nAppend New Line/' test.txt
test line 1
test line 2
test line 3
test line 4
test line 5
test line 6
#test line 7
Append New Line

Existem outras construções que podem lidar com isso também, por exemplo, o comando b (branch) em sed .

Se você quiser um código de retorno real, se não for encontrado, convém examinar gawk e sua instrução exit .

    
por 25.08.2013 / 17:11

Tags