为什么 sed 命令不替换 shell 脚本内的模式?

为什么 sed 命令不替换 shell 脚本内的模式?

我正在尝试准备一个 shell 脚本来包含几个链接的 sed 命令。

我在 FreeBSD 12 中使用/bin/sh。这似乎符合 POSIX 标准(请参阅手册页这里)。

这是我尝试过的,可以清楚地看出该行为不是预期的行为:

$ cat testfile.txt 
<TEST>

$ cat test.sh 
#!/bin/sh

while read line
do
        sed 's/<TEST>/FOO/' 
done <&0
$ cat testfile.txt | ./test.sh 

$ cat testfile.txt | sed 's/<TEST>/FOO/'
FOO

$ 

我想我在这里缺少一些基本的东西。

答案1

你是阅读行,但你没有对你读到的内容做任何事情。尝试:

#!/bin/sh

while read line
do
        printf '%s\n' "$line" | sed 's/<TEST>/FOO/'
done <&0

您可能还想将其更改while read line

while IFS= read -r line || [ -n "$line" ]

以确保您按照预期阅读所有内容cat testfile.txt | sed 's/<TEST>/FOO/'。看

答案2

无论如何,当你在shell中编写复杂的脚本,最好使用专为脚本编写的语言,而不是交互式使用。当做一些比几行代码更复杂的事情时,Python、Perl 或 Raku 是我的第一个想法。 Python 很流行,几乎随处可用,Perl 也是如此; Raku 是 Perl 的演变/彻底重新设计,还没有那么流行(还?)。

相关内容