3

私はsedを使用してファイル内のテキストを置き換えています。特定のファイルで検索および置換されるすべての文字列を含むファイルをsedに提供したいと思います。

.hファイルと.cppファイルを調べます。各ファイルで、それに含まれているファイル名を検索します。見つかった場合は、たとえば「ah」を「<ah>」に置き換えます(引用符は含みません)。

スクリプトは次のとおりです。

For /F %%y in (all.txt) do 
   for /F %%x in (allFilesWithH.txt) do
       sed -i s/\"%%x\"/"\<"%%x"\>"/ %%y
  • all.txt-置換を行うファイルのリスト
  • allFilesWithH.txt-検索するすべてのインクルード名

(input.txt内のファイル名の数として)sedを数回実行したくないのですが、単一のsedコマンドを実行してinput.txtを入力として渡したいです。

どうすればいいですか?

PS私はVxWorks開発シェルからsedを実行しているので、Linuxバージョンが実行するすべてのコマンドが含まれているわけではありません。

4

3 に答える 3

6

ループの 1 つを削除できるため、sedファイルごとに 1 回だけ呼び出す必要があります。オプションを使用して、-f複数の置換を指定します。

For /F %%y in (all.txt) do 
    sed -i -f allFilesWithHAsSedScript.sed %%y

allFilesWithHAsSedScript.sedから派生しallFilesWithH.txt、以下を含みます。

s/\"file1\"/"\<"file1"\>"/
s/\"file2\"/"\<"file2"\>"/
s/\"file3\"/"\<"file3"\>"/
s/\"file4\"/"\<"file4"\>"/

(記事Common threads: Sed by example, Part 3には、説明付きの sed スクリプトの多くの例があります。)

混乱しないでください(しゃれが意図されています)。

于 2009-10-06T11:36:03.277 に答える
4

sedそれ自体には、ファイルからファイル名を読み取る機能はありません。私は VxWorks シェルに詳しくありませんが、これは答えがないことに関係していると思います... bash で機能するものをいくつか示します。VxWorks はこれらのいずれかをサポートする可能性があります。

sed -i 's/.../...' `cat all.txt`

sed -i 's/.../...' $(cat all.txt)

cat all.txt | xargs sed -i 's/.../...'

sedそして実際には、ジョブが完了した場合に数回呼び出すことは大したことではありません。

cat all.txt | while read file; do sed -i 's/.../.../' $file; done

for file in $(cat all.txt); do   # or `cat all.txt`
    sed -i 's/.../.../' $file
done
于 2009-10-05T14:50:26.653 に答える
0

私がしたいことは、sedを使用してallFilesWithH.txtをsedコマンドに変更することです。

(sed の使用を余儀なくされた場合。実際には代わりに Perl を使用しますが、*.h ファイルの検索も実行できます。)

于 2009-10-06T07:55:42.707 に答える