文字列が見つかった最初の場所に一連の行 (約 5 行) をファイルに挿入するにはどうすればよいですか?
例えば:
BestAnimals.txt
dog
cat
dolphin
cat
$ "BestAnimals.txt の cat の前にキリンを挿入" > NewBestAnimals.txt
NewBestAnimals.txt
dog
giraffe
cat
dolphin
cat
gnu sed を使用する場合:
$ cat animals
dog
cat
dolphin
cat
$ sed "/cat/ { N; s/cat\n/giraffe\n&/ }" animals
dog
giraffe
cat
dolphin
cat
&
、一致した文字列を表します。awk -v insert=giraffe -v before=cat '
$1 == before && ! inserted {
print insert
inserted++
}
{print}
' BestAnimals.txt > NewBestAnimals.txt
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; ... }
c
cat を含む最初の行で 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
ファイルの挿入用
私は...するだろう:
grep
最初に一致した行番号を見つけるために使用しますhead
マッチまでのテキストを取得するために使用しますcat
tail
試合後にラインを取得するために使用します迅速でも、効率的でも、エレガントでもありません。しかし、それは非常に簡単です。ファイルが巨大ではない場合、および/またはこれを1秒間に何度も行う必要がある場合は、問題ありません。