O uso de sed para remover uma string da lista de arquivos falha

0

Estou no bash (Mac OS X). Eu tenho uma lista de arquivos e há uma string que eu quero remover:

$ grep -l \</html\> *.html  
21888601.html  
21906283.html  
21977081.html  
...

Todos os arquivos correspondentes são nomeados neste formato (.html). Então eu tento isso:

$ grep -l \</html\> 27776977.html | xargs -0 sed -i.back '/<\/html>/d'

O shell apenas imprime a lista de arquivos retornados do grep e um erro:

sed: 21888601.html  
21906283.html  
21977081.html  
...
: File name too long

Esses nomes de arquivos obviamente não são muito longos, então há algum outro erro aqui. Além disso, quando eu testo isso em arquivos que possuem nomes alfa (nem todos os números), não obtenho o erro.

Eu também tentei:

$ grep -l \</html\> 27776977.html | xargs -0 sed -i.back '/<\/html>/d'
sed: 27776977.html
: No such file or directory

$ grep -l \</html\> 27776977.html
27776977.html

O sed é incapaz de lidar com nomes de arquivos numéricos? Ou há algum outro problema aqui?

    
por user766353 09.07.2014 / 20:35

2 respostas

2

Como você usa a opção -0 , xargs procurará um caractere nulo, em vez de espaços em branco para finalizar o nome do arquivo de entrada. Isso faz com que todos os arquivos encontrados por grep concatram com uma string longa em vez de arquivos separados.

Mais detalhes de man xargs :

-0, --null
              Input items are terminated by a null character instead of by whitespace,  and  the  quotes  and
              backslash  are  not  special  (every  character  is taken literally).  Disables the end of file
              string, which is treated like any other argument.  Useful when input items might contain  white
              space,  quote  marks,  or backslashes.  The GNU find -print0 option produces input suitable for
              this mode.

Nesse caso, o nome do seu arquivo não possui caracteres especiais, portanto, você deve remover a opção -0 .

    
por 09.07.2014 / 20:41
1

Você precisa da opção -Z em grep se usar -0 com xargs .

Você pode ver que o erro file name to long lista todos os nomes de arquivos concatenados juntos.

man grep :

-Z, --null
          Output  a  zero  byte (the ASCII NUL character) instead of the character that normally follows a file name.
          For example, grep -lZ outputs a zero byte after each file name instead of the usual newline.   This  option
          makes  the  output  unambiguous,  even  in  the  presence  of file names containing unusual characters like
          newlines.  This option can be used with commands like find -print0, perl -0,  sort  -z,  and  xargs  -0  to
          process arbitrary file names, even those that contain newline characters.

Normalmente, grep , xargs e outros comandos usam uma nova linha ou espaço como um delimitador. Mas eles podem ser solicitados a usar um nulo, isso é útil quando os dados possuem espaços.

xargs usa a opção -0 para informar que sua entrada é delimitada por nulo, grep usa -Z ou --null para informar que ela cria saída delimitada nula.

Se o seu grep não der suporte a -Z , remova o -0 de xargs . Isso deve funcionar se os nomes dos arquivos não tiverem caracteres de nova linha.

    
por 09.07.2014 / 20:39

Tags