私はawkを以下のコードで間違った方法で使用したと言われていますが、読みやすくするためにコードを改善する方法については愚かです。awkを間違った方法で使用する
Hairy Potter:Rihanna
MARY IS A LITTLE LAMB:Kenny
Sing along:May
このプログラムは基本的にcutText.txtで新しいタイトルを更新します。下記のように
read -r bookName
read -r authorName
if grep -iqx "$bookName:$authorName" cutText.txt
then
lineNum=`awk -v bookName="$bookName" -v authorName="$authorName" '$0 ~ bookName ":" authorName {print NR} BEGIN{IGNORECASE=1}' BookDB.txt`
echo "Enter a new title"
read -r newTitle
awk -F":" -v bookName="$bookName" -v newTitle="$newTitle" -v lineNum="$lineNum" 'NR==lineNum{gsub(bookName, newTitle)}1' cutText.txt > temp2.txt
mv -f temp2.txt cutText.txt
else
echo "Error"
fi
私cutText.txtは、コンテンツが含まれています。 MARY IS A LITTLE LAMB
をMary is not a lamb
に変更する場合は、新しいタイトルを入力し、cutText.txt
は元のタイトルをMary is not a lamb
に置き換えます。
$newTitle
のユーザーが「Mary is little lamb」と入力した場合、このコードはケースを考慮に入れているため機能しません。 「MARY IS LITTLE LAMB」のユーザータイプのみが動作します。私はBEGIN{IGNORECASE=1}
がgawk-sepcificであることに気付きました。したがって、awkでは使用できません。
このようにスクリプトを作成すると、ユーザー入力の大文字小文字を無視できますか。ありがとうございました!私はちょうど私が、私は一日のために私の髪を引き裂くたし、私がしなければならなかったすべては、これを行うことでした
**** AS DUMB AM REALIZED
おそらく、ユーザーが$ bookName_の "Mary is little lamb"と入力すると、_Aの問題が発生する可能性があります。とにかく、これはawkだけの質問です。おそらく 'bash'と' shell'タグを削除してください。そして、おそらくあなたの疑問を単純化するべきでしょう。_非GNU awkにパターンでの大文字小文字の区別を無視する方法_、あなたにはどのようなふるまいがあり、どのようなふるまいが必要なのかという小さな例があります。あなたが使用しているawkのバージョンを示すことはプラスになります。 –
ヒントありがとうございました!私はまだコーディングに新しいです>< – JamesPoppycock
最初に頑強に作業してから、後で「読むのが簡単です」と心配しましょう。現在のコードは、部分一致、regexpメタキャラクタ、エスケープ文字、後方参照、コロンなどで書籍のタイトルや著者名でさまざまな方法で失敗し、awkスクリプトにエラーが発生した場合はデータベースを消去します。 –