2016-08-12 11 views
0

私は以下のコードを持っています。awk無視の場合NR

awk -F":" -v bookName="$bookName" -v newTitle="$newTitle" -v lineNum="lineNum" 'NR==lineNum{gsub(bookName, newTitle)}1' 

このコードは基本的に書籍のタイトルを新しいタイトルに更新します。 lineNumには、設定されている行番号の値が含まれていますが、コードはここには表示されません。

私はこのコード行でbookNameの大文字小文字を無視しますが、試した次のコードは機能しません。

awk -F":" -v bookName="$bookName" -v newTitle="$newTitle" -v lineNum="$lineNum" 'BEGIN{IGNORECASE=1} NR==lineNum{gsub(bookName, newTitle)}1' 

なぜそうですか?

編集John's返信

*最新の編集に基づいて: だから、基本的に私のコードは以下の通りです:

read -r bookName 
read -r authorName 

if grep -iqx "$bookName:$authorName" cutText.txt 
then 
lineNum=`awk -F":" -v bookName="$bookName" 'BEGIN{IGNORECASE=1} $0 ~ bookName ":" authorName {print NR}' BookDB.txt` 

echo $lineNum 
else 
echo "Failed" 
fi 

cutText.txt含まれています

Hairy Potter:Rihanna 
MARY IS A LITTLE LAMB:Kenny 
Sing along:May 

BookDB.txtが

が含まれています
Hairy Potter:Rihanna:2:5:20 
MARY IS A LITTLE LAMB:Kenny:39:2:1 
Sing along:May:38:2:48 

"Mary is a little lamb"をbookName、ケニーをauthorNameと入力すると、プログラムは2と出力されます。ただし、$lineNumは出力を生成しません。

+1

'-v lineNum =" lineNum "を' -v lineNum = "$ lineNum" 'に置き換えると、うまく動作します。 – John1024

+0

置き換え後、awkはまだ置き換えられません。たとえば、文字列 "MARY IS LAMB"があり、 'bookary'変数を" mary is lamb "と入力すると、変数newTitleに代入されません – JamesPoppycock

+2

Works4me。それがうまくいかない場合は、サンプルの入力と出力を表示して、どのような問題があるかを示してください。一般的な考え方では、質問に[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を含める必要があります。これまでのところ、この質問は完全でも検証可能でもありません。 – John1024

答えて

1

IGNORECASEはgawk固有であるため、gawkを使用してはいけません。移植性:

awk ... ' 
    NR==lineNum { 
     if (match(tolower($0),tolower(bookName))) { 
      $0 = substr($0,1,RSTART-1) newTitle substr($0,RSTART+RLENGTH) 
     } 
     print 
    } 
' 

しかし、あなたが本当にシェル+のgrepのミックスとしてあなたの全体のスクリプトを最初からやり直す必要があると行番号を取得するにはawkを使用してはちょうど間違ったアプローチです。スクリプトを正しく書く方法については、新しい質問を投稿してください。

関連する問題