【问题标题】:squeezing spaces that aren't in quotes in bash在bash中挤压不在引号中的空格
【发布时间】:2012-07-07 07:19:39
【问题描述】:

我正在尝试找出一种方法来压缩 bash 中不在引号中的空格(双引号和单引号)。我会使用tr -s,但它不会削减它。我想在文本文件 (foo.txt) 中有以下行:

    "      not  squeezed      "     squeeze     this     part

变成:

    "      not  squeezed      " squeeze this part

当然,嵌套单引号、双引号、转义引号会变得更加复杂,所以我想知道是否已经为此编写了某种命令?

编辑:

如果我尝试过:

    cat foo.txt | tr -s 

我会得到输出:

    " not squeezed " squeeze this part

这会压缩引号内的空格 - 这是不可取的

【问题讨论】:

  • 这是干什么用的? foo 是命令吗?

标签: regex bash quotes


【解决方案1】:

你想要的是上下文相关的,所以你必须自己解析它。

例如

cat foo.txt | (
st=0; lc=""; od -v -t o1  | cut -b 9- |
while read line
 do
  for t in $line
   do
    if [[ $st == 1 ]] ; then
     printf \\$t
    else
     if [[ "$t" != "040" ]] ; then
      printf \\$t
     else
      if [[ "$lc" != "040" ]] ; then
       printf \\$t
      fi
     fi
    fi
    if [[ "$t" == "042" ]] ; then
     st=$((1-$st))
    fi
    lc="$t"
   done
 done)

【讨论】:

    【解决方案2】:

    是的。它被称为echo ...如果您不需要打印双引号。如果你这样做,首先使用\ 转义所有未转义的" 和所有\

    如果这不是一个选项,您只需要生成一个小 bash 脚本,该脚本基本上会打印所有参数,并根据之前的参数被 " 包围。

    【讨论】:

    • 我喜欢这种方法。我一直使用回声来挤压东西。这似乎是正确的方法,但我无法想象解决这个问题的实际代码。介意花时间写出来吗?
    猜你喜欢
    • 2017-11-09
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多