sed가 sed: -e 표현식 #(숫자), char(숫자): 알 수 없는 명령: `(문자)'를 발생시킵니다.

sed가 sed: -e 표현식 #(숫자), char(숫자): 알 수 없는 명령: `(문자)'를 발생시킵니다.

나는 일부 파일을 읽고 이 파일의 모든 데이터를 다른 병합된 파일에 복사하는 쉘 스크립트를 작성했습니다.

이 작업은 여러 번 발생하며 이전에 복사한 데이터는 다시 복사되지 않습니다. 이를 위해 마지막으로 복사한 줄을 별도의 파일에 저장하고 두 번째부터 비교합니다.

논리적 흐름:

  • 처음에는 단일 파일을 읽고 마지막 행을 제외한 전체 데이터가 병합된 파일에 복사됩니다. 마지막으로 복사한 줄을 임시 파일에 저장합니다.

sed '$d' $file >> $consolidatedCSVFile

tail -2 $file | head -1 > $consolidatedCSVFile$lastLines/$(basename $file)$lastLine

  • 두 번째부터 임시 파일의 마지막 줄을 읽고 단일 파일에서 해당 줄을 검색합니다. 찾은 후에는 다음 줄의 모든 줄을 가져와 병합된 파일에 추가합니다.

전체 스크립트:

#!/bin/bash

consolidatedCSVFile=$1
endTime=$2

curdate=$(date +%s)

CSVFiles=${@:3}
CSVFiles=${CSVFiles[@]}

lastLines=_LASTLINES
lastLine=_LASTLINE

newMerge=false

# Returns 1 if Consolidated file is empty
[ -s $consolidatedCSVFile  ]
if [ $? == 1  ]
    then
        mkdir $consolidatedCSVFile$lastLines
        newMerge=true
fi

testInProcess=false

if [ $endTime -ge $curdate  ]
    then
        testInProcess=true
fi

for file in $CSVFiles
do
if $newMerge ;
    then
        touch $consolidatedCSVFile$1astLines5(basename $file)$lastLine
        sed $d $file >> $consolidatedCSVFile
        tail -2 $file | head -1 >   $consolidatedCSVFile$1astLines5(basename $file)$lastLine
    else
        availableLastLine="`cat $consolidatedCSVFile$1astLines/$(basename $file)$lastLine`"
        if $testInProcess
            then
                sed '1,/^'"$availableLastLine"'$/d' $file | sed '$d' >> $consolidatedCSVFile
                tail -2 $file | head -1 > $consolidatedCSVFile$1astLines5(basename $file)$lastLine
            else
                sed '1,/^'"$availableLastLine"'$/d' $file >> $consolidatedCSVFile
        fi
fi

done

if  !  $testInProcess ;
then
    rm -rf $consolidatedCSVFile$lastLines
fi

가끔 오류 메시지가 나타납니다.sed: -e expression #1, char 26: unknown command: 'X'

내 생각엔

JMeter에서 생성된 파일을 병합하려고 합니다. 때때로 이러한 파일은 다음과 같은 데이터를 생성합니다.1439459065780,5,SOAP/XML-RPC Request,200,OK,ws test 1-3,text,true,267,3,3,5

내 생각에 문제 sed '1,/^'"$availableLastLine"'$/d' $file | sed '$d' >> $consolidatedCSVFileSOAP/XML. 슬래시(/)는 여기서 문제를 일으킬 수 있습니다.

답변1

availableLastLine 나중에 작동하도록 수정되었습니다 availableLastLine=$(sed 's/\//\\\//' $consolidatedCSVFile$lastLines/$(basename $file)$lastLine).

관련 정보