1

UNIXの特定の行の後にテキストの行をファイルに挿入するにはどうすればよいですか?

背景:ファイルは自動生成されたテキストファイルですが、特定の行の後に4行追加するために、再生成されるたびに手動で編集する必要があります。この行が常にファイルに含まれることは保証できますが、どの行になるかを正確に保証することはできないため、固定の行番号に追加するのではなく、この行の位置に基づいて追加の行を追加する必要があります。このプロセスはビルドプロセスの一部であるため、自動化したいと思います。

私はMacOSXを使用しているので、UNIXコマンドラインツールを使用できますが、そのようなツールにあまり精通しておらず、これを行う方法を理解できません。

編集

解決策をありがとう、私はまだそれらを機能させることができませんでしたが:

Sedソリューションを試しました

sed -i '/<string>1.0</string>/ a <key>CFBundleHelpBookFolder</key>\
<string>SongKongHelp</string>\
<key>CFBundleHelpBookName</key>\
<string>com.jthink.songkong.Help</string>
' /Applications/SongKong.app/Contents/Info.plist

しかし、エラーが発生します

sed: 1: "/Applications/SongKong. ...": invalid command code S

そして私はbashソリューションを試しました

#!/bin/bash

    while read line; do
      echo "$line"
      if [[ "$line" = "<string>1.0</string>"]]; then
        cat mergefile.txt    # or echo or printf your extra lines
      fi
    done < /Applications/SongKong.app/Contents/Info.plist

しかしエラーが発生しました

./buildosx4.sh: line 5: syntax error in conditional expression: unexpected token `;'
./buildosx4.sh: line 5: syntax error near `;'
./buildosx4.sh: line 5: `  if [[ "$line" = "<string>1.0</string>"]]; then'

編集2 作業中、スペースがありませんでした

#!/bin/bash

    while read line; do
      echo "$line"
      if [[ "$line" = "<string>1.0</string>" ]]; then
        cat mergefile.txt    # or echo or printf your extra lines
      fi
    done < /Applications/SongKong.app/Contents/Info.plist
4

4 に答える 4

2

マーカーラインにfnord他に何も含まれていないと仮定します。

awk '1;/^fnord$/{print "foo"; print "bar";
    print "baz"; print "quux"}' input >output
于 2013-02-16T12:14:25.647 に答える
0

一致させる必要のある行に正規表現を指定してsed'コマンドを使用します

sed -i '/the target line looks like this/ a this is line 1\
this is line 2\
this is line 3\
this is line 4
' FILENAME
于 2013-02-16T12:20:50.050 に答える
0

このアルゴリズムにより、任意のファイルサイズで問題を効率的に解決できます。

  1. 元のファイルから各行を読み取り、一時ファイルに出力します。
  2. 最後の行がマーカー行の場合は、挿入行を一時ファイルに出力します
  3. 残りの行を印刷します
  4. 一時ファイルの名前を元のファイル名に変更します。

Perlスクリプトとして:

#!perl
use strict; use warnings;

$^I = ".bak"; # create a backup file

while (<>) {
  print;
  last if /regex to determine if this is the line/;
}

print <<'END';
Yourstuff
END

print while <>; # print remaining lines
# renaming automatically done.

テストファイル:

foo
bar
baz
qux
quux

正規表現は/^ba/です。

使用法:$ perl this_script.pl source-file

処理後のテストファイル:

foo
bar
Yourstuff
baz
qux
quux
于 2013-02-16T12:25:24.963 に答える
0

これを確認する別の方法は、ファイルの1つのある時点で2つのファイルをマージすることです。余分な4行が別のファイルにある場合は、次のようなより一般的なツールを作成できます。

#!/usr/bin/awk

BEGIN {
  SEARCH=ARGV[1];    # Get the search string from the command line
  delete ARGV[1];    # Delete the argument, so subsequent arguments are files
}

# Collect the contents of the first file into a variable
NR==FNR { 
  ins=ins $0 "\n";
  next;
}

1    # print every line in the second (or rather the non-first) file

# Once we're in the second file, if we see the match, print stuff...
$0==SEARCH {
  printf("%s", ins);    # Using printf instead of print to avoid the extra newline
  next;
}

ドキュメントを簡単にするために、これを詳しく説明しました。あなたは明らかにそれをトリプルの答えのように見えるものに短縮することができます。次のように呼び出します。

$ scriptname "Text to match" mergefile.txt origfile.txt > outputfile.txt

このようにすると、さまざまなファイルやさまざまなテキストでこの種のマージを実現するために使用できるツールが得られます。

あるいは、もちろんこれを純粋なbashで行うこともできます。

#!/bin/bash

while read line; do
  echo "$line"
  if [[ "$line" = "matchtext" ]]; then
    cat mergefile.txt    # or echo or printf your extra lines
  fi
done < origfile.txt
于 2013-02-16T13:03:47.100 に答える