Ocorreu um problema ao tentar escrever um script Bash. Quando grep
sai, retorna (geralmente) muitas linhas. Gostaria de prefixar e sufixar uma string para cada uma dessas linhas de saída.
Gostaria também de notar que eu estou canalizando ls
para grep
, como:
ls | grep
bash
shell-script
grep
SpecialBomb
fonte
fonte
ls
- é ruim juju. Além disso, tem que sergrep
? E você pode dar um exemplo de saída?Respostas:
Com sed:
fonte
sed
sendo um superconjunto degrep
:ls | sed -n '/txt/s/.*/prefix&suffix/p'
ouls | sed -n 's/.*txt.*/prefix&suffix/p'
Com
sed
:Mas observe que isso sofre de problemas com nomes de arquivos com feeds de linha e de todos os problemas variados de análise, o
ls
que geralmente é uma má idéia.Com perl
Nota - o perl
grep
pode ter um padrão - como ogrep
comando, mas você também pode fazer coisas como aplicar testes de arquivo.Por exemplo
No
grep
iterador padrão,$_
é definido o valor atual do elemento, para que você possa aplicarsed
/grep
regex de estilo ou executar uma variedade de tarefas com base em$_
.fonte
“
e use-as.Nesse caso, o GNU
find
permite que você faça todas essas coisas de uma só vez, eliminando pipes e a análise potencialmente problemática dels
:(
find
não é uma boa maneira de modificar arbitrariamente a saída de outros comandos, é claro!)Algumas notas:
-maxdepth 1
e-name [^.]*
faça com que a correspondência de nomes funcione da mesma forma que uma planíciels
(ouls .
). Você pode usar qualquer glob no estilo de shell, mas observe que "*" corresponderá a um "" inicial. em um nome † diferente debash
,[^.]*
significa qualquer coisa que não tenha um "." inicial.*thing.*
vez de apenasthing
-name
/ em-regex
vez de ambos (por exemplo, -regex "[^.]. MYPATTERN. "-printf
suporta muitas coisas ,%n
é o nome do arquivo ou diretório sem adornosComo uma alternativa possível sem a necessidade de programas externos,
bash
possuicompgen
, dentre outras coisas, a expansão de globs, equivalente a umals
opção sem opções:Ele lida com nomes de arquivos com espaço em branco, incluindo novas linhas.
compgen -G "*"
deve fornecer a mesma saída que uma planíciels
(mas observe quels *
é uma coisa completamente diferente). Você ainda precisarágrep
, e isso pode ou não resolver o problema, mas vale a pena mencionar.fonte
sed
efind
soluções são contestadas se seu prefixo / sufixo incluir caracteres-chave de expressão regular ou se desejar passar uma variável de ambiente (em vez de um valor imediato),xargs
+echo
pode ser mais apropriado aqui.Com variável de ambiente:
Com um inline:
fonte