1

У меня есть этот простой скрипт:

#!/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

Теперь я могу использовать его только с допустимым именем файла в качестве параметра, но что если я хочу, чтобы он получал выходные данные из канала и использовал их вместо $ 1 [FILE_NAME]? Как это:

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

И perlrmlastlf получить выходные данные конвейера и использовать их, а затем вывести обратно в консоль соответствующую строку без последнего символа \n

Как я могу сделать это?

1 ответ1

2

Я уверен, что есть более элегантный способ, но рано ...

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

вам нужно убрать проверку [[ $1 == "" ]] и поставить [[ ! -f $1 ]] проверить внутри блока "true" моего оператора if.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .