Извлечь и обработать белье из grep из-за ошибки в Windows (поскольку извлеченное число является строкой)

0



У меня проблема с извлеченным бельем из результата grep. Windows (gitBash) не может их сравнить, потому что число - это строка, а не число (моя macOS делает это без проблем).

То, что я хочу сделать: добавить ведущий ноль к номерам строк, если они меньше 10

Вот фрагмент кода:
local number="" local command="" # grep complete list and itereate over this list grep -n --color=always "${1}" "${2}" | while read -r greppedList ; do for ln in "${greppedList}" ; do # split the line to number and command number=$(echo ${ln} | cut -d ':' -f 1) if (( ${number} < 10 )) ; then command="${ln:2:${#ln}-1}" else command="${ln:3:${#ln}-1}" fi printWithFormattedLineNumbers "${number}" "${command}" done done
проблема в Windows заключается в этой строке if (( ${number} < 10 )) ; then.
Windows не может сравнить это, потому что это не число.

Можете ли вы помочь мне изменить способ получения белья?

m1well
источник
Я не знаю, будет ли это работать в Windows, но вы можете попробовать это while IFS=':' read num line;do printf 'number %02d - line %s\n' $num "$line";done.
Пауло,
у меня были проблемы while IFS=':' read num line, это не работало, если была только одна строка. Но самый важный факт был %02d - line %s\n' $num "$line"- это работает отлично. Спасибо!
m1well
Если передача IFS readне сработала, попробуйте выполнить вырезку непосредственно в качестве аргументов printf grep -n --color=always "${1}" "${2}" | while read -r greppedList ; do printf 'number %02d - line %s\n' "$(cut -d':' -f1 <<<"$greppedList")" "$(cut -d':' -f2- <<<"$greppedList")" ; done. Я думаю, что printfлиния заменяет forцикл.
Пауло
да, это тоже работает, но это очень длинная очередь: D спасибо вам за помощь!
m1well
Вы можете найти на github github.com/m1well/cheatsheet сценарий в строке 261 и ваш код 270;)
m1well

Ответы:

0

Проблема в окнах заключается в том, что строка if (($ {number} <10)); тогда. Windows не может сравнить это, потому что это не число.

Затем обработайте его как строку символов и используйте caseвместо if:

case "${number}" in
[0-9])
        command="${ln:2:${#ln}-1}"
        ;;
*)
        command="${ln:3:${#ln}-1}"
esac
Джим Л.
источник