Shell
為什麼 sed 命令沒有替換 shell 腳本中的模式?
我正在嘗試準備一個 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 的演變/重新設計,幾乎沒有那麼流行(還沒有?)。