条件があるかどうかにかかわらず、sedはtrueです。

条件があるかどうかにかかわらず、sedはtrueです。

私はおそらく#include <stdint.h>最初の1〜30行にCパッケージがあることを知っています。ファイルにLARGE_INTEGERGNUツールという単語が含まれている場合は、以前はその単語がなかった行にその単語を追加したいと思います。

[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>上記で見つけたファイルに最初の行を追加します。

おすすめ記事