Bash找到一个数字并添加内容

时间:2016-10-28 11:58:27

标签: bash scripting

我尝试编写一个在文件中插入4行的脚本。 我不得不在两个数字之间添加新文本。

实施例: 我不得不在12340和12348之间添加数字12345 ......

我尝试使用行编号:

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

你知道一个更好,更简单的解决方案吗?

1 个答案:

答案 0 :(得分:0)

你需要更加具体地使用grep,例如假设你的新合作伙伴ID只是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