説明したように、WindowsがLinuxドライバに変換するプロセスの一環として、単語を含むstdint.h
ファイルに標準Cパッケージを含めたいと思います。LARGE_INTEGER
ここデータ型の場合。 findとxargsの前のスレッドについて知っています。ここそしてここ。
GNU検索部分のコードは、主に以下に基づいています。ワイヤー:
gfind /tmp/ -type f \
\( -name "*.h" -o -name "*.cpp" \) \
-exec ggrep -Pl "LARGE_INTEGER" {} +
擬似コード拡張子も含めたいです。また、ファイルに次の単語を含める必要があります。LARGE_INTEGER
gfind /tmp/ -type f \
\( -name "*.h" -o -name "*.cpp" \) \
-and -exec ggrep -Pl "LARGE_INTEGER" {} \; \
| xargs gsed -i '1s/^/#include <stdint.h>\n/'
よく分からないから-and
与えるところ
gsed: can't read /tmp/: No such file or directory
...
私はcommandlinefuの例に従いました。ここ。
新しいコマンドをGNU SEDベースの検索にどのように結合しますか?
答え1
私は 次の2つの操作find
に1を使用します。-exec
探す。 -タイプ f -exec grep -qFSOME_STRING{}\; -sed実行注文する'{}\;
2 番目のコマンドは、最初のコマンドが次のように評価される場合にのみ実行されます。本物つまり終了コード 0
したがって、sed
問題のファイルは、ファイルに次のものが含まれている場合にのみ処理されます。SOME_STRING。動作方法を簡単に確認できます。
探す。 -タイプ f -exec grep -qFSOME_STRING{}\; -印刷
以下を含むファイルのみをリストする必要があります。SOME_STRING。もちろん、常に2つ以上の式を連結し!
(否定)などの演算子を使用することもできます。たとえば、次のようになります。
探す。 -タイプ f -exec grep -qFこれ{}\; -exec grep -qFそれ{}\; -印刷
以下を含むファイルのみがリストされます。これしかし含まれていませんそれ。
とにかくあなたの場合は次のようになります。
gfind /tmp/ -type f \( -name "*.h" -o -name "*.cpp" \) \
-exec ggrep -qF LARGE_INTEGER {} \; \
-exec gsed -i '1s/^/#include <stdint.h>\n/' {} \;
1
私はあなたがサポートしたり選択しxargs
たりしないと仮定します。その場合は、次の構成を使用します。-0
--null
探す。 -タイプ f -exec grep -lFZSOME_STRING{}+| xargs -0 gsed -s -i'注文する'
つまり、あなたの場合:
gfind /tmp/ -type f \( -name "*.h" -o -name "*.cpp" \) \
-exec ggrep -lFZ LARGE_INTEGER {} + | \
xargs -0 gsed -s -i '1s/^/#include <stdint.h>\n/'
最初のものよりも効率的でなければなりません。
また、どちらもすべての種類のファイル名で動作します。より高速なのでgrep
(固定文字列)を使用しているので、-F
正規表現を使用する予定の場合は削除してください。
答え2
出力をgfind
次にパイプするだけですxargs
。
gfind /tmp/ -type f \( -name "*.h" -o -name "*.cpp" \) -exec ggrep -l "LARGE_INTEGER" {} + | xargs sed -i '1s/^/#include <stdint.h>\n/'
固定文字列と一致するため、対応する-P
オプションを削除しました。ggrep
ただし、このソリューションは改行文字を含むファイル名をうまく処理できません。より安全なアプローチは、gfind
NULLで終わるファイル名を強制的に出力し、ループ内で出力を繰り返すことですwhile
。
#!/bin/bash
gfind /tmp/ -type f \( -name "*.h" -o -name "*.cpp" \) -print0 | while read -d '' -r filepath; do
[ "$(ggrep -l "LARGE_INTEGER" "$filepath")" ] && sed -i '1s/^/#include <stdint.h>\n/' "$filepath"
done
スタンドアロンバージョンが好きなら:
gfind /tmp/ -type f \( -name "*.h" -o -name "*.cpp" \) -print0 | while read -d '' -r filepath; do [ "$(ggrep -l "LARGE_INTEGER" "$filepath")" ] && sed -i '1s/^/#include <stdint.h>\n/' "$filepath"; done