我有以下代码。
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
如果我要输入"玛丽是一只小羊羔"如bookName
和"肯尼"如authorName
,程序应输出2
。但是,$lineNum
不会产生任何输出。
答案 0 :(得分: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
}
'
但你真的需要重新开始使用整个脚本,因为shell + grep和使用awk来获取行号只是错误的方法。发布一个新问题以获取有关如何正确编写脚本的帮助。