Você pode aproveitar o printf
incorporado.
mo1 () {
for file in *.txt; do
grep -n -C1 "$(printf "%s.*" "$@")" "$file"
done
}
Esta versão simples insere .*
após o último elemento. Não importa para este caso de uso específico, mas em outros casos (por exemplo, grep -o
) você pode precisar retirar o .*
extra no final.
mo1 () {
pattern=$(printf "%s.*" "$@")
pattern=${pattern%??}
for file in *.txt; do
grep -n -C1 "$pattern" "$file"
done
}
No bash, você pode colocar a saída printf
diretamente em uma variável, o que é um pouco mais rápido do que usar uma substituição de comando (mas é improvável que isso seja importante, mesmo no Cygwin onde as subshells são lentas).
mo1 () {
printf -v pattern "%s.*" "$@"
pattern=${pattern%??}
for file in *.txt; do
grep -n -C1 "$pattern" "$file"
done
}
Se você quisesse inserir um único caractere entre os parâmetros posicionais, poderia definir IFS
para esse caractere e usar "$@"
. Mas isso não funciona se o separador tiver mais de um caractere. Em ksh e bash, se houver um caractere que não apareça no padrão, você poderá usá-lo para unir-se e, em seguida, realizar uma substituição. Por exemplo, aqui, não faria sentido que os padrões contivessem novas linhas, então:
mo1 () {
typeset IFS=$'\n'
typeset pattern="$*"
pattern=${pattern//$'\n'/.*}
for file in *.txt; do
grep -n -C1 "$pattern" "$file"
done
}
No zsh, claro, há um caminho direto.
mo1 () {
for file in *.txt; do
grep -n -C1 ${(j:.*:)@} $file
done
}