Usando um aqui-doc para 'sed' e um arquivo

8

O título diz tudo, eu quero usar um aqui-doc para comandos sed e fornecer o arquivo a ser lido e o arquivo de saída.

Eu analisei o Aqui-Documentos do guia Advanced Bash Scripting, mas não menciona nada sobre argumentos regulares ao usar um aqui-doc. É mesmo possível?

Gostaria de alcançar algo como o seguinte:

#!/bin/bash
OUT=/tmp/outfile.txt
IN=/my_in_file.txt

sed $IN << SED_SCRIPT
    s/a/1/g
    s/test/full/g

SED_SCRIPT 
> $OUT;

Qualquer ajuda é muito apreciada.

    
por Tristian 16.08.2012 / 04:08

3 respostas

12

Você pode dizer ao GNU sed para ler o script da entrada padrão com -f - , -f significando ler o script de um arquivo, e - significando a entrada padrão como é comum com muitos comandos.

sed -f - "$IN" > "$OUT" << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT

O POSIX sed também suporta -f , mas o uso de - para entrada padrão não está documentado. Nesse caso, você poderia usar /dev/stdin em sistemas Linux (e parece que lembro que o Solaris também tem isso, mas não posso confirmar isso agora)

Usar <<-SED_SCRIPT (com o prefixo '-') permitirá que o tag SED_SCRIPT de fechamento seja indentado.

    
por 16.08.2012 / 04:17
4

Caso sed não suporte a leitura de um script em stdin (usando -f - ), você pode usar o processo substituição (disponível em bash , zsh , ksh93 ):

sed "$IN" > "$OUT" -f <( cat << SED_SCRIPT
    s/a/1/g
    s/test/full/g
SED_SCRIPT)

O parêntese de fechamento ) deve seguir o delimitador final ( SEC_SCRIPT ) imediatamente ou depois de uma nova linha. No caso de substituição de processo, você também pode usar echo em vez de um documento aqui:

sed "$IN" > "$OUT" -f <( echo \
"    s/a/1/g
    s/test/full/g" )
    
por 27.11.2014 / 03:06
-1

Talvez uma abordagem melhor:

OUT=/dev/stdout

IN=my_in_file.txt
sed -s 's/in/out/' < $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT < $IN

IN=my_in_text
sed -s 's/in/out/' <<< $IN > $OUT
  -or-
sed -s 's/in/out/' > $OUT <<< $IN

:)

    
por 27.11.2014 / 01:09