【问题标题】:How do prevent whitespace from appearing in these bash variables?如何防止空格出现在这些 bash 变量中?
【发布时间】:2014-04-25 11:29:54
【问题描述】:

我正在从 .ini 文件中读取值,有时可能会出现尾随或前导空格。

如何修改第一行以防止这种情况发生?

db=$(sed -n 's/.*DB_USERNAME *= *\([^ ]*.*\)/\1/p' < config.ini);
echo -"$db"-

结果;

-myinivar -

我需要;

-myinivar-

【问题讨论】:

  • 将您的捕获从\([^ ]*.*\) 更改为\([^ ]*\).* 有什么用途吗?

标签: bash shell ini


【解决方案1】:

使用parameter expansion

echo "=${db% }="

【讨论】:

    【解决方案2】:

    您不需要捕获组内的.*(或行尾的分号):

    db="$(sed -n 's/.*DB_USERNAME *= *\([^ ]*\).*/\1/p' < config.ini)"
    

    详细说明:

    1. .* 匹配任何东西
    2. DB_USERNAME 匹配该文字字符串
    3. *(一个空格后跟一个星号)匹配任意数量的空格
    4. = 匹配该文字字符串
    5. *(一个空格后跟一个星号)匹配任意数量的空格
    6. \( 启动捕获组,稍后用于\1
      1. [^ ] 匹配任何空格字符
      2. * 重复零次或多次
    7. \) 结束捕获组
    8. .* 匹配任何东西

    因此,结果将是DB_USERNAME = 之后的所有字符和任意数量的空格,直到下一个空格或行尾,以先到者为准。

    【讨论】:

    • 我猜,搜索部分应该是.*DB_USERNAME *= *\([^ ]*\).*,删除感兴趣的输出后的任何`*`。
    【解决方案3】:

    您可以使用echo 修剪空白:

    db='myinivar '
    echo -"$(echo $db)"-
    -myinivar-
    

    【讨论】:

    • 不要那样做!如果db 包含例如通配符,您将经历通配符。 echo 不适合这样使用。
    【解决方案4】:

    使用 crudini 透明地处理这些 ini 文件边缘情况

    db=$(crudini --get config.ini '' DB_USERNAME)
    

    【讨论】:

      【解决方案5】:

      要删除多个尾随空格,请使用 %% 从字符串末尾删除最长的匹配模式

      echo "=${db%% *}="

      【讨论】:

        猜你喜欢
        • 2011-05-23
        • 1970-01-01
        • 2012-05-05
        • 1970-01-01
        • 2014-05-20
        • 2016-12-28
        • 2018-03-04
        • 2011-09-22
        • 1970-01-01
        相关资源
        最近更新 更多