Bash: игнорировать специальные символы

function printTable()
{
    local -r delimiter="${1}"
    local -r data="$(removeEmptyLines "${2}")"

    if [[ "${delimiter}" != '' && "$(isEmptyString "${data}")" = 'false' ]]
    then
        local -r numberOfLines="$(wc -l <<< "${data}")"

        if [[ "${numberOfLines}" -gt '0' ]]
        then
            local table=''
            local i=1

            for ((i = 1; i <= "${numberOfLines}"; i = i + 1))
            do
                local line=''
                line="$(sed "${i}q;d" <<< "${data}")"

                local numberOfColumns='0'
                numberOfColumns="$(awk -F "${delimiter}" '{print NF}' <<< "${line}")"

                # Add Line Delimiter

                if [[ "${i}" -eq '1' ]]
                then
                    table="${table}$(printf '%s#+' "$(repeatString '#+' "${numberOfColumns}")")"
                fi

                # Add Header Or Body

                table="${table}\n"

                local j=1

                for ((j = 1; j <= "${numberOfColumns}"; j = j + 1))
                do
                    table="${table}$(printf '#| %s' "$(cut -d "${delimiter}" -f "${j}" <<< "${line}")")"
                done

                table="${table}#|\n"

                # Add Line Delimiter

                if [[ "${i}" -eq '1' ]] || [[ "${numberOfLines}" -gt '1' && "${i}" -eq "${numberOfLines}" ]]
                then
                    table="${table}$(printf '%s#+' "$(repeatString '#+' "${numberOfColumns}")")"
                fi
            done

            if [[ "$(isEmptyString "${table}")" = 'false' ]]
            then
                echo -e "${table}" | column -s '#' -t | awk '/^\+/{gsub(" ", "-", $0)}1'
            fi
        fi
    fi
}

function removeEmptyLines()
{
    local -r content="${1}"

    echo -e "${content}" | sed '/^\s*$/d'
}

function repeatString()
{
    local -r string="${1}"
    local -r numberToRepeat="${2}"

    if [[ "${string}" != '' && "${numberToRepeat}" =~ ^[1-9][0-9]*$ ]]
    then
        local -r result="$(printf "%${numberToRepeat}s")"
        echo -e "${result// /${string}}"
    fi
}

function isEmptyString()
{
    local -r string="${1}"

    if [[ "$(trimString "${string}")" = '' ]]
    then
        echo 'true' && return 0
    fi

    echo 'false' && return 1
}

function trimString()
{
    local -r string="${1}"

    sed 's,^[[:blank:]]*,,' <<< "${string}" | sed 's,[[:blank:]]*$,,'
}

ОБРАЗЦЫ

$ cat data-1.txt
HEADER 1,HEADER 2,HEADER 3

$ printTable ',' "$(cat data-1.txt)"
+-----------+-----------+-----------+
| HEADER 1  | HEADER 2  | HEADER 3  |
+-----------+-----------+-----------+

$ cat data-2.txt
HEADER 1,HEADER 2,HEADER 3
data 1,data 2,data 3

$ printTable ',' "$(cat data-2.txt)"
+-----------+-----------+-----------+
| HEADER 1  | HEADER 2  | HEADER 3  |
+-----------+-----------+-----------+
| data 1    | data 2    | data 3    |
+-----------+-----------+-----------+

$ cat data-3.txt
HEADER 1,HEADER 2,HEADER 3
data 1,data 2,data 3
data 4,data 5,data 6

$ printTable ',' "$(cat data-3.txt)"
+-----------+-----------+-----------+
| HEADER 1  | HEADER 2  | HEADER 3  |
+-----------+-----------+-----------+
| data 1    | data 2    | data 3    |
| data 4    | data 5    | data 6    |
+-----------+-----------+-----------+

$ cat data-4.txt
HEADER
data

$ printTable ',' "$(cat data-4.txt)"
+---------+
| HEADER  |
+---------+
| data    |
+---------+

$ cat data-5.txt
HEADER

data 1

data 2

$ printTable ',' "$(cat data-5.txt)"
+---------+
| HEADER  |
+---------+
| data 1  |
| data 2  |
+---------+

ССЫЛКА LIB на:https://github.com/gdbtek/linux-cookbooks/blob/master/libraries/util.bash

0
20.02.2020, 05:15
2 ответа

Для входаSomeFile:

Examples:for9 developers>http://example.org/examples?s=%20&<what>
is, this?

выдает результат:

examples
for
developers
http://example.org/examples?s=%20&
what
is
this

Я полагаю, что это можно сделать, используя только tr+оболочку:

for i in $(<SomeFile tr -cs ']a-zA-Z0-9/:.%?=&_,+()~['\''#$;!*-' '\n' | \
    tr '[:upper:]' '[:lower:]'); do
    case "$i" in
        *://*)
            echo "$i" >> net.txt ;;
        *)
            for split in $(echo "$i" | tr -c 'a-z' '\n'); do
                echo "$split" >> net.txt
            done ;;
    esac
done

Но может быть проще добавить grepкtr:

< SomeFile tr -cs ']a-zA-Z0-9/:.%?=&_,+()~['\''#$;!*-' '\n' | \
    tr '[:upper:]' '[:lower:]' | grep -o '.*://.*\|[a-z]*' > net.txt
  • В catтоже нет необходимости — просто направьте файл в стандартный ввод дляtr

группа:

grep -oE '[a-zA-Z]+://[]a-zA-Z0-9/:.%?=&_,+()~['\''#$;!*-]+|[[:alpha:]]+' \
    -- SomeFile | tr '[:upper:]' '[:lower:]' > net.txt

С zshможно использовать массив:

file=( ${(L)=$(< SomeFile)//[^]a-zA-Z0-9\/:.%?=&_,+()~[\'#$;!*-]/ } )
printf '%s\n' ${(M)file:#*://*} ${=${file:#*://*}//[^a-z]/ }
  • Сначала печатаются все URL-адреса, а затем любые «слова»
1
28.04.2021, 23:22

Можно использовать пару переводов:

tr "'"'\#$%.,:;?!&*|()[]"<>=-' ' ' <SomeFile | tr -s '[:space:]' "\n"

Первая операция преобразует любые символы, которые вам не нужны, в пробелы. Вторая операция преобразует все промежутки (, включая новые строки ), в новую строку, сжимая ряды новых строк до одного символа.

2
28.04.2021, 23:22

Теги

Похожие вопросы