2016-10-28 5 views
0

Я пытаюсь написать скрипт, который вставляет 4 строки в файл. Мне пришлось добавить новый текст между двумя номерами.Bash найти номер и добавить контент

Пример: мне пришлось добавить номер 12345 между 12340 и 12348 ...

я пытаюсь работать с числом строк, как, что:

newpartnerID = $partnerid 

while [[ $schleifeende != "Ende" ]] 

do 
    if [[ $(grep -Eo "$newpartnerID" text.txt; echo $?) -eq 1 ]] 
    then 
     let newpartnerID=$newpartnerID+1 
    else 
     schleifeende="Ende" 
     countID=$(grep -n "$newpartnerID" text.txt | cut -f1 -d:) 
     let countIDnew=${countID}-1 
    fi 
done 

, но это не работает: D

У вас есть лучшее и простое решение для этой задачи?

+0

Замечание по сайту: смешивание имен переменных на английском и немецком языках является очень уродливым. – hek2mgl

ответ

0

Вам нужно быть более конкретным с 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