我读过其他一些管道bash字符串操作问题,但它们似乎是专门的应用程序。
从本质上讲,有没有一种方法可以使以下操作更简单?
代替
$ string='hello world'; string2="${string// /_}"; echo "${string2^^}"
HELLO_WORLD
就像是
$ echo 'hello world' | $"{-// /_}" | "${ -^^}"
HELLO_WORLD
编辑我有兴趣尽可能保持bash操纵以保持速度(与sed / awk相反,后者往往会大大减慢我的脚本的速度)
Edit2:@jimmij
我喜欢第二个示例,并引导我编写了一个函数。
bash_m() { { read x; echo "${x// /_}"; } | { read x; echo "${x^^}"; }; }
echo hello world | bash_m
HELLO_WORLD
1
您为什么认为sed / awk为此目的会变慢?他们跟他们一样快。
—
mkc 2014年
@Ketan Sed和awk是独立的进程,因此它们永远不会很快,因为bash在不启动独立进程的情况下可以本地完成。通常,这种差异几乎不会引起注意,但是在shell脚本中性能通常很重要的情况下,就是某个循环或计算被重复很多次,并且生成数以千计的进程比在bash中进行简单的字符串操作要慢得多。
—
jw013
@ jw013对于问题中的短字符串,如“ hello world”,这是正确的,但如果
—
jimmij 2014年
tr
手册说字符串很长,则相反,因为与产生字符串的时间相比,产生进程的时间可以忽略不计sed
并awk
致力于。如果字符串非常长,请参见整个bash手册,则由于某些内部限制,bash可能会完全拒绝继续进行。
@ jw013我声称bash的字符串操作的代码效率不高则专用工具
—
jimmij 2014年
sed
,awk
,tr
或类似的。看一下gena2x答案,我在一段时间前编辑了它,确切地添加了以下信息:unix.stackexchange.com/questions/162221/…您可能想将它与同一个问题的terdon答案进行比较,在该问题中他给了一些时间来输入短字符串,其中案例处理产生时间最多。您可以自己测试并发布结果。
@Miati为什么您认为这额外
—
jw013
read x; echo $x
的性能会更好?该语法看起来并不简短或更简洁。x=${x// /_}; x=${x^^}
与{read x; echo ${x...
。相同的方法是一种更简洁的方法。就性能而言,@jimmij指出tr
/ sed
将比bash
,叉数相等要快。使用管道始终会导致额外的过程,因此保存分叉的论点不再适用。因此,如果使用管道,则只需使用sed
/ tr
etc read x; echo $x
。