Вам нужно быть более конкретным с grep, например, предположим, что ваш новый идентификатор партнера был всего 1234. Он будет соответствовать вашим уже существующим строкам с 12340 и 12348 и поэтому не будет включен.
Управление файлами такого рода, вероятно, лучше выполняется с помощью других инструментов, чем просто bash, например awk и/или sed, как показано ниже.
Оказывается, ваш файл формата и в таком порядке, что partnerid1 меньше partnerid2 и каждый из соответствующих строк:
partnerid1:some text
line1 for partnerid1
line2 for partnerid1
line3 for partnerid1
line4 for partnerid1
partnerid2:some other text
line1 for partnerid2
line2 for partnerid2
line3 for partnerid2
line4 for partnerid4
Допуская выше заказанный файл, вы можете сделать следующее:
#!/bin/bash
partnerid=`head -1 $1 | cut -f1 -d:`
partnerrows=`wc -l $1 | awk '{print $1}'`
# find insert point
FN=text.txt
NEWFN=new.text.txt
Linenumber=`cat $FN | awk -v partnerid=$partnerid -v partnerdata=$1 -v rowcount=$partnerrows '
BEGIN {
partnerid = partnerid + 0
INRANGE=0
inserthere=0
}
/^[0-9]+:/ {
sub(/\:.*/,"")
id = $0 + 0
if (partnerid == id) {
inserthere = -1
exit
}
# if not in range, check if it is now
if (INRANGE == 0) {
if (partnerid > id) {
INRANGE = 1
inserthere = NR + rowcount - 1
}
}
# if in range and this id now less, then have our location
if (INRANGE == 1) {
inserthere = NR + rowcount - 1
if (partnerid < id) {
inserthere = NR -1
exit
}
}
}
END {
print inserthere
}
'`
FNLEN=`wc -l $FN | awk '{print $1}'`
rm -f $NEWFN
touch $NEWFN
if [ $Linenumber -gt 0 ]; then
cat $FN | sed -n "1,${Linenumber}p" >> $NEWFN
fi
if [ $Linenumber -ge 0 ]; then
cat $1 >> $NEWFN
fi
if [ $Linenumber -ge 0 -a $Linenumber -le $FNLEN ]; then
Linenumber=$((Linenumber + 1))
cat $FN | sed -n "${Linenumber},\$p" >> $NEWFN
fi
Замечание по сайту: смешивание имен переменных на английском и немецком языках является очень уродливым. – hek2mgl