2009-03-31 26 views
5

私は私のデータベースにインポートしようとしている私のLinuxボックスに2GBのテキストファイルを持っています。特定の行をテキストファイルの行番号で置き換えるにはどうすればよいですか?

私がいる問題は、このRDFファイルを処理しているスクリプトは1行に窒息されていることである。

mismatched tag at line 25462599, column 2, byte 1455502679: 
<link r:resource="http://www.epuron.de/"/> 
<link r:resource="http://www.oekoworld.com/"/> 
</Topic> 
=^ 

私は</Line></Topic>を交換したいです。私は検索/すべての行を置換することはできませんが、私はラインの番号を持っているので、私はいくつかの簡単な方法だけで新しいテキストを1行を置き換えることを望んでいるので。

アイデア/提案はありますか?

答えて

11
sed -i yourfile.xml -e '25462599s!</Topic>!</Line>!' 
+0

オープニングタグが同じ行にある場合、それは動作しません。 –

+0

良いキャッチです。一定。 – chaos

+0

今すぐ実行してください。ありがとう! – GeoffreyF67

7
sed -i '25462599 s|</Topic>|</Line>|' nameoffile.txt 
2

最初25462598行を取得し、残りのライン(25462601から始まる)を取得するには、「尾」を使用するには、「頭」を使用してください。しかし... 2GBファイルの場合、これはしばらく時間がかかるでしょう。

また、問題はその行だけで以前の場所ではないことも確かです(つまり、実際の問題が他の場所にあることを意味するXML解析エラーのように見えます)。

+0

ラインタグは自己完結しているので、余分なはどこか別の場所で起動する必要があります。 –

+0

これは私を見せてくれました。ありがとう! – GeoffreyF67

5

編集テキストファイルのUnixでするためのツールは、(名前としてストリームエディタある意味これは、sedではなく)ed呼ばれています。

edは、かつて対話型エディタとして意図されていましたが、簡単にスクリプトを作成することもできます。 edの動作は、すべてのコマンドがアドレスパラメータを取ることです。特定の行をアドレス指定する方法は行番号だけであり、アドレス指定された行を変更する方法はsコマンドです。sedと同じ正規表現を使用します。だから、42行目を変更するには、42s/old/new/のようなものを書いてください。ここで

は、コマンド全体です:

FILENAME=/path/to/whereever 
LINENUMBER=25462599 

ed -- "${FILENAME}" <<-HERE 
    ${LINENUMBER}s!</Topic>!</Line>! 
    w 
    q 
HERE 

これの利点はsed-iフラグは多くのシステムでは利用できません独自のGNUの拡張である一方でedは、標準化されたということです。

1

私のシェルスクリプト:

#!/bin/bash 
awk -v line=$1 -v new_content="$2" '{ 
     if (NR == line) { 
       print new_content; 
     } else { 
       print $0; 
     } 
}' $3 

引数:

first: line number you want change 
second: text you want instead original line contents 
third: file name 

このスクリプトを使用すると、リダイレクトする必要があり、その後、出力をstdoutに出力します。例:

すべての引数に期待値が設定されているかどうかに注意して、改善することができます。

関連する問題