相关疑难解决方法(0)

为什么使用 shell 循环处理文本被认为是不好的做法?

在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?

正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念可靠性易读性性能安全性

这个答案解释了可靠性易读性方面:

while IFS= read -r line <&3; do
  printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)

为了性能,从文件或管道读取时,while循环和读取非常慢,因为内置read shell一次读取一个字符。

怎么样的概念安全性方面?

shell text-processing

241
推荐指数
4
解决办法
5万
查看次数

在`while IFS= read..`中,为什么IFS没有效果?

我可能有一些绝对错误的地方,但对我来说看起来很有说服力,将 IFS 设置为pre-do/done 列表中的命令之一绝对没有效果。
外部 IFS(while构造外部)在下面脚本中显示的所有示例中都占优势。

这里发生了什么?我对 IFS 在这种情况下的作用有什么误解吗?我希望数组拆分结果如“预期”列中所示。


#!/bin/bash
xifs() { echo -n "$(echo -n "$IFS" | xxd -p)"; } # allow for null $IFS 
show() { x=($1) 
         echo -ne "  (${#x[@]})\t |"
         for ((j=0;j<${#x[@]};j++)); do 
           echo -n "${x[j]}|"
         done
         echo -ne "\t"
         xifs "$IFS"; echo
}
data="a  b   c"
echo -e "-----   --  -- \t --------\tactual"
echo -e "outside        \t  IFS    \tinside" 
echo -e "loop           \t Field   \tloop" 
echo -e "IFS     NR  NF \t …
Run Code Online (Sandbox Code Playgroud)

shell text-processing environment-variables

14
推荐指数
2
解决办法
7637
查看次数

运行 ed(1) 脚本时回显 stdin

鉴于以下ed脚本,

$ cat helloworld
a
hello
world
.
,n
,s,o,O,g
,n
Q
Run Code Online (Sandbox Code Playgroud)

我想以某种方式获得交互式输出

$ ed
a
hello
world
.
,n
1   hello
2   world
,s,o,O,g
,n
1   hellO
2   wOrld
Q
$
Run Code Online (Sandbox Code Playgroud)

而不是预期的

$ cat helloworld | ed
1   hello
2   world
1   hellO
2   wOrld
$
Run Code Online (Sandbox Code Playgroud)

这可能吗,也许使用第三方实用程序?提前致谢!

编辑:我想我应该增加一些动力。我想制作一些示例 ed 会话,并可能将它们保存为script(1). 如果此过程是“实时”执行的,则任何修改基本上都意味着再次键入整个教程(不好)或“弄清楚”输出,这可能是基于长时间的编辑会话(更糟)。

shell stdin ed

6
推荐指数
1
解决办法
505
查看次数

如何计算文本中的空格?

在以下示例中,inet 前有 4 个空格。

wolf@linux:~$ ip address show eth0 | grep 'inet '
    inet 10.10.10.10/24 brd 10.10.10.255 scope global dynamic eth0
wolf@linux:~$ 
Run Code Online (Sandbox Code Playgroud)

我如何计算这个例子中的空格数。

这个示例很简单,因为它只有 4 个空格。

如果它有更多呢?几百,几千?

是否有捷径可寻?

whitespace

2
推荐指数
2
解决办法
1326
查看次数