Eu tenho um arquivo como abaixo:
line1
line2
line3
E eu quero obter:
prefixline1
prefixline2
prefixline3
Eu poderia escrever um script Ruby, mas é melhor se eu não precisar.
prefix
irá conter /
. É um caminho, /opt/workdir/
por exemplo.
linux
scripting
text-processing
pierrotlefou
fonte
fonte
sed
para tarefas leves como esta. Se "prefixo" é conhecido, é muito fácil escolher um caractere que não seja "prefixo".sed
em um pipeline, por exemplofoo | sed -e 's/^/x /' | bar
.sed -e '2,$s/^/prefix/'
./
mesmo modo\/
(em cadeias simples) ou\\/
(em cadeias duplas) #sed -e 's/$/postfix/' file
se você deseja adicionar uma sequência ao final de cada linha.Com Perl (substituição no local):
fonte
prtinf "$VARIABLE\n" | awk '$0="prefix"$0'
awk
relatóriosawk: out of memory in readrec 1 source line number 1
, mas a solução ésed
concluída com êxito.Você pode usar o Vim no modo Ex:
%
selecione todas as linhass
substituirx
salvar e fecharfonte
:%s/^/prefix/
, uma vez que esta estratégia acaba por ser útil em muitas situaçõesSe o seu prefixo é um pouco complicado, basta colocá-lo em uma variável:
Então, você passa essa variável e deixa o awk lidar com ela:
fonte
Se você tem Perl:
fonte
Usando o shell:
fonte
Aqui está uma solução oneliner altamente legível usando o
ts
comando de moreutilsE como é derivado passo a passo:
fonte
Embora eu não ache que o pierr tenha essa preocupação, eu precisava de uma solução que não atrasasse a saída do "final" ativo de um arquivo, pois queria monitorar vários logs de alerta simultaneamente, prefixando cada linha com o nome do respectivo log .
Infelizmente, sed, cut, etc. introduziram muito buffer e me impediram de ver as linhas mais atuais. A sugestão de Steven Penny de usar a
-s
opção denl
era intrigante, e os testes provaram que não introduziam o buffer indesejado que me preocupava.Porém, houve alguns problemas com o uso
nl
, relacionados ao desejo de remover os números de linhas indesejados (mesmo que você não se importe com a estética dele, pode haver casos em que o uso de colunas extras seria indesejável). Primeiro, usar "recortar" para eliminar os números reintroduz o problema do buffer, destruindo a solução. Segundo, o uso de "-w1" não ajuda, pois isso NÃO restringe o número da linha a uma única coluna - apenas aumenta à medida que são necessários mais dígitos.Não é bonito se você deseja capturar isso em outro lugar, mas como é exatamente isso que eu não precisava fazer (tudo estava sendo gravado nos arquivos de log, eu só queria assistir vários de uma vez em tempo real), o melhor Uma maneira de perder os números de linha e ter apenas meu prefixo era iniciar a
-s
sequência com um retorno de carro (CR ou ^ M ou Ctrl-M). Então, por exemplo:fonte
-u
opção sed para evitar o buffer.Usando ed:
Isso substitui, para cada linha (
,
), o início da linha (^
) porprefix
.wq
salva e sai.Se a sequência de substituição contiver uma barra, podemos usar um delimitador diferente para
s
:Eu citei o delimitador here-doc
EOE
("end of ed") para impedir a expansão de parâmetros. Neste exemplo, ele também não funcionaria entre aspas, mas é uma boa prática evitar surpresas se você tiver um$
em seu script ed.fonte
Usando & (toda a parte da entrada que correspondeu ao padrão ”):
OU usando referências anteriores:
fonte
Você também pode conseguir isso usando a técnica de backreference
Você também pode usar com o awk como este
fonte
Aqui está um exemplo embrulhado usando a
sed
abordagem de esta resposta :prefix_lines
fonte
PREFIX
houver caracteres especiais para sed como uma barra.prefix_lines \*
Para as pessoas nos sistemas BSD / OSX, existe um utilitário chamado
lam
, abreviação de laminado.lam -s prefix file
fará o que você quiser. Eu o uso em dutos, por exemplo:find -type f -exec lam -s "{}: " "{}" \; | fzf
... que encontrará todos os arquivos, exec lam em cada um deles, dando a cada arquivo um prefixo de seu próprio nome de arquivo. (E bombeie a saída para fzf para pesquisa.)
fonte