shell参数扩展中匹配换行符的Bash模式



我的bash脚本中有一个长变量。我正在尝试以块为单位对其进行迭代以进行一些处理。它在很大程度上起作用:

while [ ${#REMAINING_PLAN} -gt 0 ] ; do
CURRENT_PLAN=${REMAINING_PLAN::65300} # Truncate to 65k and iterate
# problematic line:
CURRENT_PLAN=${CURRENT_PLAN%'\n'*} # trim truncated string to the last newline

PROCESSED_PLAN_LENGTH=$((PROCESSED_PLAN_LENGTH+${#CURRENT_PLAN})) # evaluate length of outbound batch and store

# do some stuff not shown
REMAINING_PLAN=${REMAINING_PLAN:PROCESSED_PLAN_LENGTH}
done

我试图将一个变量截断为最大长度,然后进一步将所有内容剥离到文件中的最后一行,这样我的下一个"批处理"就可以在新的一行上开始处理。但这份声明并没有达到我的目的:

CURRENT_PLAN=${CURRENT_PLAN%'\n'*} # does not actually trim truncated string to the last newline

它出了什么问题?如何将字符串修剪到换行符的最后一个实例?

将我的评论转换为答案,以便为未来的访问者轻松找到解决方案。

您可以在bash中使用它来去除最后一行中断后的所有字符:

CURRENT_PLAN="${CURRENT_PLAN%$'n'*}"

$'n'是类似C的结构,用于bash中表示换行符。

最新更新