【问题标题】:How to check if a value contains characters in bash如何检查值是否包含bash中的字符
【发布时间】:2021-12-19 19:44:39
【问题描述】:

我有这样的价值观

B146XYZ, G638XYZ, G488xBC

我必须编写一个 bash 脚本,当它看到逗号时,它必须删除逗号并添加 7 个空格,如果它看到逗号和空格或只是空格(没有标点符号),它必须添加 7 个空格使它们都固定长度。

if [[  $row = *’,’* ]]
then
first= “${ row%%,*}”
echo “${first }       “

我试过但不明白如何为其余条件添加条件,特别是在 G488xBC 等单值条件下苦苦挣扎

【问题讨论】:

  • 您不能在脚本(或大多数其他编程语言)中使用大引号。编辑代码时关闭“智能引号”。
  • edit修复这些错误。我们需要一个minimal reproducible example,让我们自己看到您的问题。如果我们不知道问题是由问题中的拼写错误引起的还是由您的真实代码引起的,我们该如何回答这个问题?
  • IFS=', ' read -r -a words <<<"$line"; printf '%-7s\n' "${words[@]}"
  • @user2708013, ...请注意,我不知道这是否真的是您需要的,但您没有提供 minimal reproducible example 来演示与输入样本配对的预期/期望输出,所以除了猜测您的意图之外,此问题中没有足够的信息来真正做任何事情。
  • 请添加合适的 shebang (#!/bin/bash),然后将您的脚本粘贴到 shellcheck.net 并尝试实施那里提出的建议。

标签: linux bash shell unix


【解决方案1】:
    VALUES=`echo $VALUES | sed 's/,/ /g' | xargs`
  • sed 命令会将逗号替换为一个空格。
  • xargs 会将任意数量的空格合并到一个空格中。

现在,您的值是用空格分隔的字符串而不是逗号,由未知数量的空格分隔。

从那里你可以使用for i in $VALUES; do printf "$i\t"; done

使用上面的制表符会给你对齐的输出,以防你的值长度可能不同。

但如果你的值总是相同的长度,那么你可以通过这样做让它更简单

    VALUES=`echo $VALUES | sed 's/,/ /g' | xargs | sed 's/1 space/7 spaces/g'`
    echo $VALUES

【讨论】:

    【解决方案2】:
    newrow="${row//,/       }"
    

    【讨论】:

      【解决方案3】:

      刚刚呢:

      sed -E 's/[, ]+/       /g' file
      

      或者类似这样的东西会打印一个填充表格,只要没有字段长度超过 13 个字符:

      awk -F '[,[:space:]]+' \
      '{
          for (i=1; i<NF; i++) {
              printf("%-14s", $i)
          }
      
          print $NF
      }'
      

      或者在纯 bash 中同样的事情:

      while IFS=$', \t' read -ra vals; do
          last=$((${#vals[@]} - 1))
      
          for ((i=0; i<last; i++)); do
              printf "%-14s" "${vals[i]}"
          done
      
          printf '%s\n' "${vals[last]}"
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-23
        • 2019-02-06
        • 2012-08-11
        • 1970-01-01
        • 2021-11-07
        • 2012-05-06
        • 2022-01-25
        相关资源
        最近更新 更多