我正在尝试准备一个 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 的演变/彻底重新设计,还没有那么流行(还?)。