Shell-Script

更改文件中的 1 行的最有效方法

  • August 14, 2020

我想以最有效的方式遞歸地更改數百個文件的第一行。我想要做的一個例子是更改#!/bin/bash#!/bin/sh,所以我想出了這個命令:

find ./* -type f -exec sed -i '1s/^#!\/bin\/bash/#!\/bin\/sh/' {} \;

但是,據我了解,這樣做 sed 必須讀取整個文件並替換原始文件。有沒有更有效的方法來做到這一點?

sed -i的,完全讀取和重寫文件,並且由於行長度發生變化,它必須移動所有其他行的位置。

…但在這種情況下,行長實際上不需要更改。#!/bin/sh␣␣我們可以用兩個尾隨空格代替hashbang 行。作業系統將在解析 hashbang 行時刪除它們。(或者,使用兩個換行符,或一個換行符 + 井號,這兩者都會創建 shell 最終會忽略的額外行。)

我們需要做的就是從一開始就打開文件進行寫入,而不是截斷它。通常的重定向>>>不能這樣做,但在 Bash 中,讀寫重定向<>似乎有效:

echo '#!/bin/sh  ' 1<> foo.sh

或使用dd(這些應該是標準 POSIX 選項):

echo '#!/bin/sh  ' | dd of=foo.sh conv=notrunc

請注意,嚴格來說,它們都在行尾重寫換行符,但這並不重要。

當然,上面無條件地覆蓋了給定文件的開頭。添加檢查原始文件是否具有正確的 hashbang 作為練習……無論如何,我可能不會在生產中這樣做,顯然,如果您需要將行更改為更長的行,這將不起作用.

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