Minha própria versão do seu script provavelmente seria:
set -- *.java
test -e "$1" && {
fortyequals=$(printf '%040d\n' | tr 0 \=)
for javaFile do
printf '%s\nIn file: %s\n%s\n' \
$fortyequals "$javaFile" $fortyequals
grep -E '^[^/]{2}.*(ftp|http)' "$javaFile"
done
} >>~/Desktop/externalservers.txt
A solução já oferecida é desnecessariamente específica do shell. Você poderia conseguir o mesmo efeito com a sintaxe portátil - o que faz com que menos se lembre a longo prazo com a vantagem adicional de ser mais robusto como:
set -- *.java
test -e "$1" &&
for javaFile do
# ...iterate on $javaFile here...
done
Outra vantagem é que você não apenas retém o valor mais recente de $javaFile
após o loop, mas também retém todos os valores que $javaFile
tiveram em $@
. Isso possibilita o seguinte:
...
done
echo "The previous for loop processed $# files."
echo "The first file processed was:"
printf "///\t'%s'\t///\n" "$1"
echo "The last file processed was:"
printf "///\t'%s'\t///\n" "$javaFile"
echo 'All files processed in the for loop were:'
printf "///\t'%s'\t///\n" "$@"
E se você realmente gosta do {
curlies }
você pode usá-los - mesmo em bash
(embora eles sejam desnecessários) - mas você tem que delimitar entre os dois shell palavras reservadas }
e done
como:
for ... do {
...
} ; done
Embora minha recomendação seja que você coloque todo o bloco - ao redor do loop for
e qualquer pós-processamento que você fizer - em curlies dependentes das palavras reservadas &&
como:
set -- *.java
test -e "$1" && {
for ... done
# ...further processing on $@...
}
Olhando para trás e acredito que posso ajudar bastante com o regex também ... Parece que estamos procurando por linhas contendo as palavras
link e / ou
ftp que não
não começam com dois
// .
Acho que o restante é resultado das operações grep
separadas que você faz. Você parece estar tentando limpar linhas em branco, mas, como imagino, essas são causadas apenas em primeiro lugar por gravações anexadas repetidas no arquivo.
Então, em vez disso, poderíamos escrever apenas a saída de for
loop diretamente no arquivo de saída para manter o descritor de gravação para ~/Desktop/externalservers.txt
até que o loop tenha terminado, o que deve evitar que linhas em branco sejam gravadas. Talvez como:
for ... done >>outfile
Ou
{ grouped ; command ; list ; } >>outfile
No mínimo, posso dizer que essa declaração provavelmente não faz o que você quer:
sed 's/^\n//' $file
sed
is \n
ewline delimitado - é impossível encontrar um \n
ewline como o caractere ^
primeiro em uma linha. Você pode obter \n
ewlines no espaço padrão de sed
por vários meios, mas nunca sem algum processamento.