Debian sed: não consigo ler

1

Estou tentando executar um comando para remover require_once dos arquivos php de aqui (código abaixo), mas estou recebendo o erro:

sed: can't read -: No such file or directory

Estou na pasta correta; qual é o problema?

find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
  -not -wholename '*/Application.php' -print0 | \
  xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ /g'

Atualização:

Se eu correr:

find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
  -not -wholename '*/Application.php' -print0

Eu recebo:

find: invalid predicate '-wholename'

Eu tentei isso e ele retornou uma lista de todos os arquivos:

find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
  -not -name '*/Application.php' -print0

Mas alterando o original para refletir isso:

find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
  -not -name '*/Application.php' -print0 | \ xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ /g'

Dá o erro:

-bash: xargs: command not found

FYI, estou executando a versão 4.1.2 do sed e já estou um pouco perdido na linha de comando, então, por favor, explique as respostas

    
por Ashley 11.11.2010 / 16:49

5 respostas

1

O erro parece indicar que o sed tenta ler stdin . Você já tentou apenas a parte find para ver se ela retorna algum arquivo?

    
por 11.11.2010 / 17:19
1

Sua segunda invocação não faz sentido, porque o "\" antes do xarsg? Você tenta chamar um programa chamado "xargs", e o bash lhe diz que não pode encontrá-lo (note o espaço em branco duplo após os dois pontos), o que não é surpreendente.

Para se livrar do caso de erro em que o sed trava quando o xargs retorna zero arquivos (porque está tentando ler stdin quando não há argumentos de linha de comando), você deve adicionar -r aos seus argumentos xargs.

    
por 12.11.2010 / 22:38
0

Qual versão de sed você tem? O POSIX sed não entende as opções de duplo traço, nem minised, mas o GNU sed faz.

Para algo mais portátil (e IMO mais agradável), tente sed -i '/require_once/s![[:space:]]*!&// !' .

    
por 11.11.2010 / 17:22
0

Eu prefiro perl -pi.bak para esses tipos de casos.

FMTYEWTK no link

(FMTYEWTK significa Muito Mais do Que Você Queria Saber)

    
por 04.08.2011 / 01:26
0

Infelizmente, a página à qual a pergunta está vinculada desapareceu, por isso não posso verificar o comando original. Em vez disso, vou fazer algumas suposições.

O primeiro erro vem da execução do GNU sed e da edição no local em um arquivo de entrada chamado - . Este arquivo não existe e você recebe esse erro:

Exemplo (usando um script sed vazio):

$ sed -i -e '' -
sed: can't read -: No such file or directory

De onde vem o nome do arquivo - , não sei, mas pode ter algo a ver com a não obtenção de nomes de arquivos de find (veja abaixo).

Parece que você mudou para outra máquina ou implementação find , porque agora o comando find não reconhece mais o teste -wholename . Esse erro me confunde.

Em seguida, você altera -wholename para -name , mas você deve alterá-lo para -path , pois -wholename é o mesmo que -path no GNU find .

Seu comando find ainda não funcionará, mesmo se você alterar -wholename para -path , pois a expressão usada deve ser uma expressão regular.

Como uma expressão regular, */Application.php corresponde à string exata */Application.php . Um * no início de uma expressão regular corresponde a um literal * . Você pode ter pretendido usar .*/Application.php , mas isso seria o mesmo que -name "Application.php" .

Considerando todos os itens acima, e removendo a chamada xargs ( esse erro vem de escapar do espaço na frente do nome do comando, que então se torna parte do nome real do comando, que não pode ser encontrado):

find . -type f -name '*.php' \
    ! -path '.*/Loader/Autoloader.php' \
    ! -name 'Application.php' \
    -exec sed -i 's/require_once/\/\/ &/' {} +

Isso também reduz a chamada para o GNU sed um pouco, para que ele não precise usar expressões regulares estendidas.

Relacionados:

por 21.07.2018 / 15:30

Tags