gpt4 book ai didi

Bash IFS 忽略行尾的分隔符

转载 作者:行者123 更新时间:2023-12-04 16:18:22 24 4
gpt4 key购买 nike

我有一个充满键值对的文件。我写了这个 shell 脚本,它读取每一行并拆分键值。

while IFS='=' read -r key value
do
something

done < < application.properties.

其中一处房产看起来像这样 Connections/Database/Token=#!VWdg5neXrFiIbMxtAzOwmH+fM2FNtk6QPLhgOHw=
运行我的脚本时,它可以拆分它,但忽略了字符 =在行尾。

它给
key = Connections/Database/Token
value = #!VWdg5neXrFiIbMxtAzOwmH+fM2FNtk6QPLhgOHw

但它应该是这样的:
 key = Connections/Database/Token
value = #!VWdg5neXrFiIbMxtAzOwmH+fM2FNtk6QPLhgOHw=

最佳答案

TL;DR 添加显式 =到每个输入行的末尾,然后在使用之前将其从结果值中删除。

为什么它的工作方式如此

https://mywiki.wooledge.org/BashPitfalls#pf47 .总之,=根据 POSIX definition of field-splitting,在 IFS 中不被视为字段分隔符,而是字段终止符。 .

当你写

IFS== read -r key value <<< "foo=var="

输入首先分为两个字段,“foo”和“var”(不是“foo”、“var”和“”)。变量和字段一样多,所以你只需要 key=foo 和 value=var

如果你有
IFS== read -r key value <<< "foo=var=="

现在有三个字段:“foo”、“var”和“”。因为只有两个变量,那么key=foo,并赋值:
  • 值“var”,正常
  • 输入
  • 中紧跟在“var”之后的分隔符“=”
  • 来自输入的字段“”
  • 输入中“”后面的分隔符“=”

  • POSIX specification for read 有关每个变量的详细信息到 read在输入进行字段拆分后分配一个值。

    因此,永远不会有由字段分割输入产生的尾随空字段,
    只有一个尾随分隔符被添加回最终变量。

    如何保存输入

    要解决此问题,请将显式 = 添加到您的输入中,然后将其从结果值中删除。
    $ for input in "foo=bar" "foo=bar=" "foo=bar=="; do
    > IFS== read -r name value <<< "$input="
    > echo "${value%=}"
    > done
    bar
    bar=
    bar==

    在你的情况下,这意味着使用一些东西
    while IFS='=' read -r key value
    do
    value=${value%=}
    ...
    done < < (sed 's/$/=/' application.properties)

    或者,按照建议 first by Ivan , 使用参数扩展运算符来分割输入而不是 let read做吧。
    while read -r input; do
    key=${input%%=*}
    value=${input#*=}
    ...
    done < application.properties

    不管怎样,请记住只有 =在这里被视为分隔符;如果您的属性看起来像 name = value,您可能需要修剪键中的尾随空格和值中的前导空格。而不是 name=value .

    关于Bash IFS 忽略行尾的分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59958316/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com