从变量中删除所有空格、制表符、换行符等?

从变量中删除所有空格、制表符、换行符等?

这是我收到的错误,它失败是因为一个变量的值应该是 2 (我使用 a 得到这个select * from tabel)。我在该变量中得到了空格。

+ 0 != 
         2
./setjobs[19]: 0:  not found.

如何从该变量中删除所有这些空格或换行符?可以tr,,,sed或者有什么帮助吗?

这就是我正在做的:

set_jobs_count=$(echo  "set heading off;
      select count(*) from oppar_db
      where ( oppar_db_job_name, oppar_db_job_rec ) in ($var) ;" | \
  sqlplus -s ${OP_ORA_USER}/${OP_ORA_PASS}@$OPERATIONAL_DB_NAME)

这按建议工作:

| sed 's/[[:space:]]//g'

但我仍然获得如下值:

  set_jobs_count=
  2

答案1

在输出中留下换行符的原因sed 's/[[:space:]]//g'是因为数据sed一次呈现为一行。因此,替换不能替换数据中的换行符(它们根本不是所sed看到的数据的一部分)。

相反,您可以使用tr

tr -d '[:space:]'

这将删除空格字符、换页符、换行符、回车符、水平制表符和垂直制表符。

答案2

在 ksh、bash 或 zsh 中:

set_jobs_count=…
set_jobs_count=${set_jobs_count//[[:space:]]/}

在任何类似 Bourne 的 shell 中,您可以删除前导和尾随空格,并将所有中间空格标准化为单个空格,如下所示:

set -f
set -- $set_jobs_count
set_jobs_count="$*"
set +f

set -f关闭通配符;如果您知道数据不包含任何字符\[?*,则可以省略它。

假设$IFS包含其默认值空格、制表符、换行符。其他空白字符(CR、VT、FF...)保持不变。

答案3

正如已经建议的,使用“tr -d '[:space:]'”,但如果这不起作用,可能在较旧的 Unix 系统上,需要覆盖所有这些字符:

\011 HT    '\t' (horizontal tab)
\012 LF    '\n' (new line)
\013 VT    '\v' (vertical tab)
\014 FF    '\f' (form feed)
\015 CR    '\r' (carriage ret)
\040 SPACE ' '  (space)

有了这个:

tr -d '\011\012\013\014\015\040'

但是,也许还有其他不可见的字符混淆了输出,“select count(*) ...”的结果应该只是一个整数,因此只留下数字:

tr -dc '0-9'

但是,如果第一个数字后面还有其他字符,然后是更多数字,则该方法将不起作用。因此,只返回找到的第一个数字序列:

perl -ane '/\d+/ && print($&) && exit'

## example: will return '11', but raw output looks like '22 33'
(echo -e '\a11\b\b22 33') | perl -ane '/\d+/ && print($&) && exit'

答案4

有一个更简单的方法 - 使用(任何)shell分词

让我们创建一个这样的脚本:

#!/bin/bash
readonly CONN="${RDS_ADMIN}@//${RDS_HOST}/${RDS_DBNAME}"

SCN=$(sqlplus -S $CONN << EOF
SET HEADING OFF
SELECT CURRENT_SCN FROM V\$DATABASE;
EOF
)

echo ">>>$SCN<<<"
SCN=$(echo $SCN)
echo ">>>$SCN<<<"

这是脚本的输出:

oracle@ctrl-dev|265$ ./t.sh
>>>
   87401840<<<
>>>87401840<<<
oracle@ctrl-dev|266$ 

不需要外部命令,缺点是VAR=$(echo $VAR)结构看起来不太好。

相关内容