sed: Вопрос о разделении файлов сценариев sed - PullRequest
0 голосов
/ 03 сентября 2018

Я использовал скрипт sed, чтобы разделить файл на множество XML-файлов по ключевому слову:

сценарий:

#!/bin/sh
File=/home/spark/PktLog
count=0
line=(`sed -n '/?xml version="1.0" encoding/=' $File`)
num=${#line[@]}
for n in ${line[*]}
do
   [ $count -eq 0 ] && startLine=$n && continue
   let count+=1
   let endLine=n-1
   if [ $count -eq $num ]; then
      startLine=$n
      sed -n "${startLine},$ p" $File >result_${count}.txt
   else
      sed -n "${startLine},${endLine} p;q" $File >result_${count}.txt
      startLine=$n
   fi
done

но не разбивать много файлов. Я отлаживаю скрипт оболочки

spark@ubuntu:~$ sh -x split.sh 
+ File=/home/spark/PktLog
+ count=0
+ line=(`sed -n '/?xml version="1.0" encoding/=' $File`)
++ sed -n '/?xml version="1.0" encoding/=' /home/spark/PktLog
+ num=333
+ for n in '${line[*]}'
+ '[' 0 -eq 0 ']'
+ startLine=1
+ continue
+ for n in '${line[*]}'
+ '[' 0 -eq 0 ']'
+ startLine=137
+ continue
+ for n in '${line[*]}'
+ '[' 0 -eq 0 ']'
+ startLine=244
+ continue
+ for n in '${line[*]}'
+ '[' 0 -eq 0 ']'
+ startLine=415
+ continue
+ for n in '${line[*]}'
+ '[' 0 -eq 0 ']'
+ startLine=522
+ continue
+ for n in '${line[*]}'
+ '[' 0 -eq 0 ']'
+ startLine=674
+ continue
+ for n in '${line[*]}'
+ '[' 0 -eq 0 ']'
+ startLine=780
+ continue
+ for n in '${line[*]}'
+ '[' 0 -eq 0 ']'
+ startLine=932
+ continue
+ for n in '${line[*]}'
+ '[' 0 -eq 0 ']'
+ startLine=1038
+ continue
+ for n in '${line[*]}'
+ '[' 0 -eq 0 ']'

Как исправить ошибку? Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018
#!/bin/sh
File=/home/spark/PktLog
count=0
startLine=(`sed -n -e '/?xml version="1.0" encoding/=' $File`)
fileEnd=`sed -n '$=' $File`
endLine=(`echo ${startLine[*]} | awk -v a=$fileEnd '{for(i=2;i<=NF;i++) printf("%d ",$i-1);print a}'`)

let maxIndex=${#startLine[@]}-1

for n in `seq 0 $maxIndex`

do
    sed -n "${startLine[$n]},${endLine[$n]}p" $File >result_${n}.xml
done

echo $startLine[@]
0 голосов
/ 03 сентября 2018

Получение номеров строк чего-либо, чтобы вы могли циклически повторять файл, является антипаттерном. sed может сделать это с небольшой помощью, но для этого имеет больше смысла переключиться на инструмент более высокого уровня.

awk '/\?xml version="1.0" encoding/ {
    if (f) close(f);
    f = "result_" ++i }
  { print >f }' "$File"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...