管道 bash 字符串操作

管道 bash 字符串操作

我读过一些其他管道 bash 字符串操作问题,但它们似乎是专门的应用程序。

本质上,有没有办法让下面的事情变得更简单?

代替

$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD

就像是

$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD

编辑如果可能的话,我有兴趣留在 bash 操作中以保持速度(而不是 sed/awk,它们往往会大大减慢我的脚本速度)

编辑2:@jimmij

我喜欢第二个例子,它引导我创建了一个函数。

bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD

答案1

吉米说的话。他的最后一个例子是最接近您在管道表达式中尝试的内容的。

这是该主题的一个变体:

echo 'hello world'|echo $(read s;s=${s^^};echo ${s// /_})

我倾向于使用tr,因为它相当快。

echo 'hello world'|tr ' [:lower:]' '_[:upper:]'

我认为 bash 不允许嵌套参数扩展是一种耻辱; OTOH,使用此类嵌套表达式很容易导致代码难以阅读。除非你真的如果需要尽可能快地运行,最好编写易于阅读、理解和维护的代码,而不是编写看起来很聪明但需要调试的 PITA 代码。如果你真的需要以最快的速度完成任务,您应该使用编译的代码,不是一个脚本。

答案2

您不能以这种方式传递参数扩展。当您在表单中引用x使用$符号"${x}"时,它必须是真正的变量名,而不是标准输入,至少不是在bash.您可以通过zsh以下方式执行嵌套参数替换:

$ x=''hello world'
$ echo ${${x// /_}:u}
HELLO_WORLD

(注:与:u相同)zsh^^bash

在 bash 中嵌套是不可能的,我认为您所写的内容是最好的,但如果出于任何奇怪的原因您需要将管道纳入方程式,那么您可能想尝试一下:

$ echo 'hello world' | { read x; echo "${x// /_}"; } | { read y; echo "${y^^}"; }
HELLO_WORLD

相关内容