為什麼 sed 指令不取代 shell 腳本內的模式?

為什麼 sed 指令不取代 shell 腳本內的模式?

我正在嘗試準備一個 shell 腳本來包含幾個連結的 sed 命令。

我在 FreeBSD 12 中使用/bin/sh這裡)。

這是我嘗試過的,可以清楚看出該行為不是預期的行為:

$ 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 的演變/徹底重新設計,還沒有那麼流行(還?)。

相關內容