私はおそらく#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法
状態を先に見て、必要ならば交換してくれるので良い解決策ではないかと思います。これワイヤーwhileループ構造が出てくるコードにgrepを追加することをお勧めします。ここ
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の2つの条件文を効率的に組み合わせる方法は?
ベストアンサー1
私があなたの記事を正確に解読したかどうかはわかりません。次のスクリプトは、#include <stdint.h>
(1)単語が含まれていLARGE_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
(for -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>
上記で見つけたファイルに最初の行を追加します。