Como posso usar a saída de pipeline de diferentes comandos dentro de um script bash personalizado?

1

Eu tenho este script simples:

#!/bin/bash

# This command removes the last "\n" (line feed) character from the file specified as parameter
#
# Params:
# $1 [FILE_NAME] - the name of the file to trim

if [ "$1" = "" ]; then
        echo "perlrmlastlf - A command utility which uses perl to remove the last \"\n\" (line feed) character inside a file"
        echo $'\r'
        echo "perlrmlastlf: missing FILE_NAME"
        echo "Usage: perlrmlastlf [FILE_NAME]"
        echo $'\r'
        exit;
fi

if [[ ! -f $1 ]]; then
        echo "perlrmlastlf - A command utility which uses perl to remove the last \"\n\" (line feed) character inside a file"
        echo $'\r'
        echo "perlrmlastlf: wrong FILE_NAME $1: No such file"
        echo "Usage: perlrmlastlf [FILE_NAME]"
        echo $'\r'
        exit;
fi

FILE=$1
TMP_FILE="$FILE.tmp.perlrmlastlf"
perl -0 -pe 's/\n\Z//' $FILE > $TMP_FILE

mv $TMP_FILE $FILE

Agora, posso usá-lo apenas com um nome de arquivo válido como parâmetro, mas e se eu quiser que ele receba a saída de um canal e use isso em vez de $ 1 [FILE_NAME]? Assim:

user:machine ~$ cat file.txt | pcregrep -o "some pattern" | perlrmlastlf
user:machine ~$ # output of 'cat file.txt | pcregrep -o "some pattern"' but without last \n, if present

E faça com que perlrmlastlf receba a saída do pipeline e use-a e, em seguida, retorne para o console a string correspondente sem o último \ n char

Como posso conseguir isso?

    
por user3019105 29.12.2014 / 07:31

1 resposta

2

Tenho certeza de que há uma maneira mais elegante, mas é cedo ...

if (( $# > 0 )); then
    # the "-i" option takes care of writing to a tmp file and 
    # overwriting the original file
    perl -0 -i -pe 's/\n\Z//' "$1"
else
    # read from stdin and write to stdout
    perl -0 -pe 's/\n\Z//'
fi

você precisará remover a [[ $1 == "" ]] check e colocar a [[ ! -f $1 ]] check dentro do bloco "true" da minha declaração if.

    
por 29.12.2014 / 14:20