Bash

sed 如果有和沒有條件正確

  • June 30, 2015

我知道我可能#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>在上面找到的文件中添加第一行。

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