Aqui está uma abordagem mais complicada que dá saída que você pode preferir.
Funciona melhor se você costuma procurar por strings simples
(sem caracteres especiais regex)
e não use nenhuma opção (ou, pelo menos, use a (s) mesma (s) opção (s) a cada hora).
Meu script greptrim
:
#!/bin/bash
case "$1" in
("")
echo "Usage: $0 string [files...]"
exit 2
;;
(-*)
echo "This script can't take options."
exit 2
;;
esac
read rows cols <<< $(stty size)
if [ "$cols" = "" ]
then
cols=80
fi
margin=$(( (cols-${#1}) / 2 ))
grep -o ".\{,$margin\}$1.\{,$margin\}" "${@:2}"
- Preliminares: verifique se existe um argumento string (padrão) não nulo
e que não é uma opção.
- Então, usamos outra maneira de obter o número de colunas. 1
- Da largura da tela (número de colunas),
subtraia a largura do argumento da string (
${#1}
e divida por dois.
Isso calcula o número de caracteres que você pode ter
à esquerda e à direita da string
e ainda tem a linha encaixada no terminal.
Por exemplo, para uma sequência de 10 caracteres em uma tela de 80 colunas,
margin
será 35 (porque 35 + 10 + 35 = 80).
- O comando final parece um pouco com
grep -o "$@"
,
mas nós fazemos grep -o "$1" "${@:2}"
.
"${@:2}"
é uma base que significa "$@"
, mas a partir de $2
(se houver).
- Envolvemos
$1
com .\{,$margin\}
- por exemplo, .\{,35\}
- antes e depois.
Isso corresponde a até 35 de qualquer caractere,
Assim, no total, nosso padrão corresponde a até 80 caracteres.
com o original $1
no meio.
-
-o
significa a saída apenas do texto correspondente -
então nós produzimos no máximo 80 caracteres por linha.
Eu usei este texto de exemplo:
Once upon a midnight dreary, while I pondered, weak and weary, Over many a quaint and curious volume of forgotten lore—
While I nodded, nearly napping, suddenly there came a tapping, As of some one gently rapping, rapping at my chamber door.
“’Tis some visitor,” I muttered, “tapping at my chamber door— Only this and nothing more.”
e aqui está um exemplo executado em uma tela de 80 colunas:
$ ./greptrim or raven.txt
r many a quaint and curious volume of forgotten lore—
ently rapping, rapping at my chamber door.
“’Tis some visitor,” I muttered, “tapping at my chamber d
oor— Only this and nothing more.”
Observe que a string "ou" aparece seis vezes no verso:
"F ou obtido", "l ou e", "fazer ou ", "visitar ou ", “Do ou ” e “m ou e”.
Note que temos a terceira linha da entrada duas vezes
porque "visit ou " e "do ou " têm mais de 39 caracteres de diferença.
Mais notas:
- Obviamente, o script pode ser estendido para lidar com opções.
Apenas se torna complicado descobrir qual argumento é o padrão
e qual (is) são o (s) nome (s) do arquivo (s).
- Se você sempre quiser usar algumas opções, como
-i
,
basta adicioná-lo ao comando grep
no script.
- Se você adicionar
-n
, deverá subtrair 4 ou 5 de cols
.
- Você pode usar o script com um padrão
isso é mais complexo que uma string simples
mas os resultados podem ser insatisfatórios,
porque um regex curto pode corresponder a um segmento de texto longo (ou vice-versa),
então o cálculo de
margin
estará errado,
e você pode obter mais (ou menos) do que 80 caracteres por linha.
- Se você adicionar
-E
,
você deve alterar a regex de margem para .{,$margin}
(remover as barras invertidas).
-
Um recurso opcional é alterar a última linha para
grep -o ".\{,$margin\}$1.\{,$margin\}" "${@:2}" | grep --color=auto "$1"
para realçar a string de pesquisa:
Notequeo"ou" em "esquecido" se alinha perfeitamente com o "ou" em "porta".
Isso vai acontecer em geral
para sequências que aparecem mais de margin
caracteres
desde o início da linha.
por
12.02.2018 / 06:20