4

文字列が見つかった最初の場所に一連の行 (約 5 行) をファイルに挿入するにはどうすればよいですか?

例えば:

BestAnimals.txt

dog
cat
dolphin
cat

$ "BestAnimals.txt の cat の前にキリンを挿入" > NewBestAnimals.txt

NewBestAnimals.txt

dog
giraffe 
cat
dolphin
cat
4

5 に答える 5

11

gnu sed を使用する場合:

$ cat animals
dog
cat
dolphin
cat

$ sed  "/cat/ { N; s/cat\n/giraffe\n&/ }" animals
dog
giraffe
cat
dolphin
cat
  1. (/cat/) に一致する行
  2. 次の行に進む (N)
  3. 一致したパターンを挿入と一致した文字列に置き換えます。ここで&、一致した文字列を表します。
于 2012-09-03T13:38:00.487 に答える
3
awk -v insert=giraffe -v before=cat '
  $1 == before && ! inserted {
    print insert
    inserted++
  }
  {print}
' BestAnimals.txt > NewBestAnimals.txt
于 2012-09-03T18:55:12.223 に答える
2

awk ソリューション:

awk '/cat/ && c == 0 {c = 1; print "giraffe"}; {print}' \
     BestAnimals.txt

挿入したい動物が「MyOtherBestAnimals.txt」にある場合は、次のこともできます

awk '/cat/ && c == 0 {c = 1; system("cat MyOtherBestAnimals.txt") }; {print} ' \
     BestAnimals.txt

;awk 条件とアクションのペアを分離するため、この回答は基本的に次のように分類できます。

  • /cat/ && c == 0 { c = 1; ... }ccat を含む最初の行で 1 に設定されます。その後、 に置かれたコマンド...が実行されますが、現在は 1 であるため、一度だけ実行されcます。
  • {print}条件なしの印刷アクション: 任意の入力行を印刷します。これは、上記の条件とアクションのペアの後に行われます。

の実際の内容に応じて...、「cat」を含む最初の行を出力する前に、キリンが出力されるか、「MyOtherBestAnimals.txt」の内容が標準出力に送信されます。

編集

@glenn jackman のソリューションを分析した後、このソリューションはまだ改善できるようです: 入力ファイルを使用する場合

nyan cat
cat

nyan catデータはに等しい行の前ではなく前に追加されcatます。解決策は、行全体が と等しくなるように要求することcatです。

awk '$0 == "cat" && c == 0 {c = 1; print "giraffe"}; {print}' \
     BestAnimals.txt

単一行の挿入用

awk '$0 == "cat" && c == 0 {c = 1; system("cat MyOtherBestAnimals.txt") }; {print} ' \
     BestAnimals.txt

ファイルの挿入用

于 2012-09-03T13:53:36.183 に答える
0

私は...するだろう:

  1. grep最初に一致した行番号を見つけるために使用します
  2. headマッチまでのテキストを取得するために使用します
  3. を使用して新しいコンテンツを挿入しますcat
  4. tail試合後にラインを取得するために使用します

迅速でも、効率的でも、エレガントでもありません。しかし、それは非常に簡単です。ファイルが巨大ではない場合、および/またはこれを1秒間に何度も行う必要がある場合は、問題ありません。

于 2012-09-03T13:27:18.630 に答える