字符串替换:如果为空则替换,否则为空

字符串替换:如果为空则替换,否则为空

我想知道这类东西是否有简写。

目前我能做到。

var_empty=; [ -n "$var" ] || var_empty=1; #intermediary variable
echo "REPL_if_var_empty_otherwise_empty=${var_empty:+REPL}"

没有中介的话可以吗?

我试过

sh -c 'readonly SAME=SAME; var=; echo test0=${var:-SAME} test1=${SAME:+REPL}; echo REPL_if_var_empty_otherwise_empty=${${var:-SAME}:+REPL}'

但这会导致bad substitution最后一个echo( test0=SAME test1=REPL) 出错。这是为什么?还有别的办法吗?

答案1

在 bash、ksh 或仿真zshksh,您可以执行以下操作:

r=empty;output=${r[${#var}]}

zsh

output=${${var:-empty$var}%$var}

否则,你总是可以做

output=;[ "$var" ]||output=empty

答案2

不确定我是否遵循您所说的“没有中介”的意思 - 如果您的意思是“在一行上完成所有操作”或“甚至不进行变量分配,直接完成所有操作”,但以下是每种解释的方法:

方法 1a - 使用变量赋值:

$ testVar=; [[ "${testVar}" ]] && testVar="" || testVar="was empty"; echo $testVar

方法 1b - 使用变量赋值:

testVar=; testVar=$( [ $testVar ] || echo "was empty"); echo $testVar

方法 2 - 无分配:

$ testVar=; [[ "${testVar}" ]] && echo "" || echo "was empty"

输出:

was empty

奖金:

泛化 - 选择你需要的部分 - 根本不需要变量:

echo testValue | { echo -n "Original value: "; tee >(read -n 1 && echo "wasn't empty" || echo "was empty"); }

替换echo testValue为您将用来分配变量的原始命令。

泛化 - 使用 awk:

echo -n | awk 'BEGIN{print "Original value: "}; d=1; END{if (!d) {print "was empty"} else {print "was not empty"} }'

再次,选择您需要的案例(对于OP的问题,不需要原始值,但这可能是一个不太常见的用例)。如果您需要从变量开始,echo那就从变量开始。如果您需要将结果分配给变量,请使用命令替换(将整个内容包装在$( ... ).

注意:据我所知,sed在这些情况下不会有任何帮助,因为它是 100% 面向行的,并且“空情况”根据定义是零行。因此,sed它将在有机会处理您告诉它的任何内容之前退出。另外,我对 Perl 不是很熟悉,但我无法弄清楚——尽管我猜 Perl 擅长的人可以。 Bash 的功能如{var:=param}等。对于OP的情况并不是特别有帮助,但为了完整性我会提到它们。我希望它们对原始字符串进行操作,而不仅仅是命名字符串变量,原因与OP相同(如果以后不需要它们,我喜欢避免中间体)。

相关内容