2011-02-04 4 views
4

行10から始まる既存のファイルにテキストを書き込むスクリプトが必要です。空行であるため、検索/置き換えはできません。それがbashにあることが望ましいですが、端末が解釈できるものはうまく動作します。10行目に書き込むには?

RE-EDITED: 

申し訳ありませんが、私がテストした後、まだ問題のビットを持つ...それは私がファイルへの書き込みを望むものとは何かを持っていると思います。

bashを使用して
sed -i -e '10a\ 
new stuff' file 

::私は

IFS=$'\n' 
i=0 
while read -r line; do 
    i=$((i+1)) 
    if test $i -eq 10; then 
     echo "new stuff" 
    else 
     echo "$line" 
    fi 
done <file >file.tmp 
mv file.tmp file 

注多分これはsedを使用して事前に簡単に...

3 c 
    4 d 
    5 e 
    6 f 
    7 g 
    8 h 
    9 i 
10  zone "$zone" in { 
12   type master; 
13   file "/etc/bind/db.$zone"; 
14 }; 
15 k 
16 l 
17 m 

おかげで、 ジョー

+1

'もちろんed'を、使用してください。 – tchrist

答えて

8

を行います10行目と11行目のどちらに挿入するのか分からないのでubleは私が10の上に書いた場所をチェックします。 sedコマンドの場合は9bashの場合は11が必要です。

perlには、$NR変数を使用できます。

open FILEHANDLE, "<file"; 
while (<FILEHANDLE>) { 
    if ($NR == 10) { 
     # do something 
    } 
} 

そしてawkで、それはNRです。

awk 'NR != 10 { print } 
NR == 10 { print "Something else" }' file 

しかし、あなたが見つけることができることに注意して空白行を置き換え、例えばあなたは何ができる

sed -i -e 's/^$/replacement text/' file 
+0

おかげさまで私はsedがもっと見やすく見えるのですが、9行目と11行目に既にテキストがあるので、10行目に挿入してください。 – jmituzas

+0

'sed -i'は標準ではありません。 – tchrist

+0

Linux、FreeBSD、Mac OS、Cygwinでのみ動作します。 Solaris、AIX、HP-UXなどでGNU sedをインストールする必要があります。あるいは出力を一時ファイルにリダイレクトしてから 'mv'してください。 – Mikel

2

:これは分別ファイルが既に9つのラインを持っている場合sed

0

でそれを行うよりも高速です、それはシェル上では​​簡単だろうという

head -10 fileA > fileB; echo "new text" >> fileB; 

注意を。 )

ファイルが9行未満である場合や、ライン10に書き込みたいまで)のperl MODUL Tie::Fileは本当に簡単に物事を行います:SEDと

#!/usr/bin/perl 
use Tie::File; 
tie my @file, 'Tie::File', '/path/to/some/file' or die $!; 
$file[9] = "I am the content of line 10"; 
+1

'perl -i'だけではないのはなぜですか? – tchrist

+0

@Mikel申し訳ありません私は問題とエラーを持っていたので、私は再編集しました...非常に多くの迅速な応答ありがとう。 – jmituzas

2

を:

sed '10 s/^/text' file >file.new && mv file.new file 

GNU-のsedで:

sed -i '10 s/^/text' file 

のawkで:

awk 'NR==10 {$0="text"} 1' file >filen.new && mv file.new file 
+0

'sed -i'は標準ではありません。 – tchrist

+0

だから、私は "gnu-sed"と書いたのです:) – marco

1
sed 10cFoobar foo 

は、10行目を「Foobar」に置き換えます。これは、改行が含まれていてもよい:

sed 4cFoobar"\nFoobar" foo 

これは、cの代わりに使用ミケルのソリューションとは対照的です。違いは、1つが置き換えられ、もう1つが追加されるということです。

0

ルビー(1.9+)

$ ruby -i.backup -ne 'print ($.==10)?"word\n":$_' file