Shell

為什麼 sed 命令沒有替換 shell 腳本中的模式?

  • May 25, 2021

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

/bin/sh在 FreeBSD 12 中使用。這似乎與 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

$ 

我想我在這裡缺少一些基本的東西。

您正在閱讀台詞,但您沒有對所閱讀的內容做任何事情。嘗試:

#!/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/'。看

無論如何,雖然您可以在 shell 中編寫複雜的腳本,但最好使用為腳本設計的語言,而不是互動式使用。Python、Perl 或 Raku 是我在做一些比幾行程式碼更複雜的事情時的第一個想法。Python 很流行,幾乎無處不在,Perl 也是如此。Raku 是 Perl 的演變/重新設計,幾乎沒有那麼流行(還沒有?)。

引用自:https://unix.stackexchange.com/questions/651371