![管道 bash 字符串操作](https://linux22.com/image/58285/%E7%AE%A1%E9%81%93%20bash%20%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C.png)
我读过一些其他管道 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