我尝试编写一个在文件中插入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
你知道一个更好,更简单的解决方案吗?
答案 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