Bash
sed 如果有和沒有條件正確
我知道我可能
#include <stdint.h>
在前 1-30 行中有 C 包。LARGE_INTEGER
如果文件包含GNU 工具的單詞,我想將它添加到以前沒有的行中。代替$$ 0,1 $$火柴
我首先想到的是更換
$$ 0,1 $$匹配總是如下,但現在我認為額外的替換是不必要的,所以應該避免:
gsed -i '1-30s/^(#include <stdint.h>\n)?/#include <stdint.h>\n/'
我建議拒絕這個。
額外的 ggrep 方法說不匹配
我認為這可能是一個很好的解決方案,因為它首先查看條件,然後在必要時進行替換。該執行緒建議添加一個額外的 grep 所以程式碼,其中 while 循環結構來自這裡
while read -d '' -r filepath; do \ [ "$(ggrep -l "LARGE_INTEGER" "$filepath")" ] && \ [ "$(ggrep -L "#include <stdint.h>" "$filepath") ] \ | gsed -i '1s/^/#include <stdint.h>\n/' "$filepath" done
然而,這給了
test.sh: line 5: stdint.h: No such file or directory
並且確實將包添加到行中而沒有
#include <stdint.h>
太多這是錯誤的。如何有效地組合 SED 的兩個條件語句?
我不確定我是否正確解密了您的散文。下面的腳本添加
#include <stdint.h>
到目前目錄中 (1) 包含 wordLARGE_INTEGER
和 (2) 尚未包含的文件<stdint.h>
:sed -i -e '1i\' -e '#include <stdint.h>' $( egrep -c '#include +<stdint\.h>' $( fgrep -lw LARGE_INTEGER * ) | \ sed -n '/:0$/ { s/:0$//; p; }')
該腳本假定為 GNU
sed
(用於-i
)。詳細地:
fgrep -lw LARGE_INTEGER *
列出目前目錄中包含單詞的文件LARGE_INTEGER
egrep -c '#include +<stdint\.h>'``#include <stdint.h>
通過fgrep
上面找到的文件計算出現的次數sed -n '/:0$/ { s/:0$//; p; }'
選擇具有 0 個匹配項的文件並僅保留文件名sed -i -e '1i\' -e '#include <stdint.h>'``#include <stdint.h>
在上面找到的文件中添加第一行。