2

是否可以将参数扩展与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

换句话说,我可以根据单行表达式中另一个字符的位置来获取字符串中一个字符的位置吗?

4

1 回答 1

1

至于!在匹配Oh look!正则表达式的行中获取位置,只需:

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

您也可以根据自己的喜好进行计算,因此使用您的原始代码,我认为应该是:

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

是否可以将参数扩展与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))
于 2020-05-29T08:35:42.630 回答