Комбинируйте выражения и раскрытие параметров в bash - PullRequest
2 голосов
/ 29 мая 2020

Можно ли комбинировать раскрытие параметров с арифметическими c выражениями в bash? Например, могу ли я сделать однострочник для оценки здесь lineNum или numChar?

echo "Some lines here
Here is another
Oh look! Yet another" > $1

lineNum=$( grep -n -m1 'Oh look!' $1 | cut -d : -f 1 )  #Get line number of "Oh look!"
(( lineNum-- ))                                         # Correct for array indexing

readarray -t lines < $1

substr=${lines[lineNum]%%Y*}                            # Get the substring "Oh look! "
numChar=${#substr}                                      # Get the number of characters in the substring
(( numChar -= 2 ))                                      # Get the position of "!" based on the position of "Y"

echo $lineNum
echo $numChar

> 2
  8

Другими словами, могу ли я получить позицию одного символа в строке на основе позиции другой в однострочном выражении?

1 Ответ

1 голос
/ 29 мая 2020

Что касается получения позиции ! в строке, которая соответствует Oh look! регулярному выражению, просто:

awk -F'!' '/Oh look!/{ print length($1) + 1; quit }' "$file"

Вы также можете выполнить расчет по своему вкусу, поэтому с вашим исходным кодом я думаю это будет:

awk -F':' '/^[[:space:]][A-Z]/{ print length($1) - 2; quit }' "$file"

Можно ли комбинировать раскрытие параметров с выражениями арифметических c в bash?

Для вычисления ${#substr} у вас должна быть подстрока. Таким образом, вы можете:

substr=${lines[lineNum-1]%%.*}; numChar=$((${#substr} - 2))

Вы также можете отредактировать свой grep и сделать фильтрацию из Y с помощью bash, но awk будет быстрее:

IFS=Y read -r line _ < <(grep -m1 'Oh look!' "$file")
numChar=$((${#line} - 2))

Тем не менее, вы можете объединить 3 строки в:

numChar=$(( $(<<<${lines[lineNum - 1]%%Y*} wc -c) - 1))
...