2017-05-01 18 views
0

私はホームサーバー用のプロジェクトで作業しています。設定ファイルの特定の行のテキストを変更する必要がある場所です。私が変更する必要がある行には、値が異なるユニークな属性名がありますが、ファイルに新しい行が追加され、私が変更したい行の位置が時々移動することがあります。私は、「変更」する3行目の内容を変更するためのスクリプトを書いたこのbashの変数行番号を使って特定の行を変更する

# cat kvirc4.ini 
# KVIrc configuration file 
[Main] 
LocalKvircDirectory=C:\Users\Aulus\AppData\Roaming\KVIrc4\ 
SourcesDate=538186288 

のように見える私のPC上のランダムな設定ファイルを選んだのスクリプトを記述し、テストするに 。このようなスクリプトを書くと、スクリプト内で行番号を直接指定すると、その1行が変更されたソースファイルの内容を示す出力ファイルが期待どおりに機能します。私は行番号を見つけて、私は行のスクリプトを指定するためのawkでの使用変数にそれを保存するためにコマンドを追加すると

# cat bashscript.sh 
#!/bin/bash 
awk '{ if (NR == 3) print "different"; else print $0}' kvirc4.ini.bak > output 

は、しかし、もはやファイルの元のバージョンを残してその行への変更を行うものではありません。変数に正しい値が設定されていることを確認するために、以下に示すエコーを追加しました。問題は、私のawkコマンドが行番号を正しく読み込んでいないためにif文がfalseのままであるが、まだbashとawkに少し新しかったので、修正する方法がわからないということです。誰かが解決策を見つけるのに役立つアドバイスを提供できますか?

# cat bashscript.sh 
#!/bin/bash 
lineno=$(awk '/LocalKvircDirectory/{ print NR; exit }' kvirc4.ini.bak);lineno=$(printf '%b' $lineno) 
echo $lineno 
# awk 'NR==$lineno {$0="changed"} { print }' kvirc4.ini.bak 
awk '{ if (NR == "$lineno") print "different"; else print $0}' kvirc4.ini.bak > output 
+1

はどのようにするためにhttps://stackoverflow.com/questions/15786777/can-we-use-shell-variables-in-awk見ますawkでシェル変数を使う... – Sundeep

答えて

0

あなたは何の関係もないされ、awkのコードではbashパラメータ展開スタイル ("$lineno")を使用しています。

"$lineno"は一重引用符であるため、決して展開されません。

あなたは、いくつかのオプションがあります。

  1. あなたは"$lineno"仕事をするために引用異なる使用することができます。

    awk '{ if (NR == '"$lineno"') print ··· 
    
  2. 使用は

    awk -v lineno="$lineno" '{ if (NR==lineno) print ··· 
    
  3. コマンドラインで変数の初期化をawkは

    bash変数の値を取得します。 the ENVIRON awk arrayを使用して(環境で、すなわち)エクスポートされました:

    export lineno 
    awk '{ if (NR==ENVIRON["lineno"]) print ··· 
    
関連する問題