【问题标题】:Preserve space in a string [duplicate]在字符串中保留空间[重复]
【发布时间】:2021-11-06 04:48:48
【问题描述】:

$cat 进程文件.csv

"key1","key1-ConnString","Server=database.windows.net,1433;Database=sqldb;Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"

进程文件.sh

#!/bin/bash
strip_quotes() {
   echo `sed -e 's/^"//' -e 's/"$//' <<<"$1"`
}

while IFS=, read -r key1 keyC secretValue; do
 echo "$(strip_quotes $secretValue)"
done  < process-file.csv
$ ./process-file.sh

Server=database.windows.net,1433;Database=sqldb;Persist

如何在需要删除引号的字符串中保留空格?

【问题讨论】:

  • 使用 shellcheck.net 检查您的脚本。 IE。删除所有 echo 并引用变量。

标签: bash sed ifs


【解决方案1】:
  • 去掉反引号。 (在为 1992 年后的 shell 编写的代码中根本不应该使用它们;$(...) 是现代的、POSIX 标准化的命令替换方式。

  • 引用你所有的扩展。 全部。如果您确实需要$(something),那么它需要是"($something)"带引号。反引号也是如此。

  • 不要运行echo $(somecommand)——只运行somecommand。它更快,并且避免了不带引号的扩展(如上所述)产生的错误。

修复上述问题,但保留代码的一般结构,可能如下所示:

#!/bin/bash
strip_quotes() {
   sed -e 's/^"//' -e 's/"$//' <<<"$1"
}

while IFS=, read -r key1 keyC secretValue; do
 strip_quotes "$secretValue"
done  < process-file.csv

...但这很愚蠢(并且非常很慢),当您可以只运行sed 的一个副本来处理整个输入文件时,而不是开始一个新的@987654328 副本@ 为您的代码当前所做的每一行。

sed -re 's/^[^,]*,[^,]*,"(.*)"/\1/' <process-file.csv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2021-09-17
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多