읽기 루프 동안 sed가 완료되지 않은 명령

읽기 루프 동안 sed가 완료되지 않은 명령

testPage다음 텍스트라는 테스트 파일이 있습니다.

|| '''Title1''' || '''Title2''' || '''Title3''' ||
|| Cell11 || Cell12 || Cell13 ||
|| Cell21 || Cell22 ||
|| Cell31 || Cell32 ||
|| Cell41 || Cell42 ||
|| CEll51 || Cell52 ||
|| Cell61 || Cell62 ||
|| Cell71 || Cell72 ||

내가 원하는 모습:

{|
|'''Title1''' || '''Title2''' || '''Title3''' ||
|-
| Cell11 || Cell12 || Cell13 ||
|-
| Cell21 || Cell22 ||
|-
| Cell31 || Cell32 ||
|-
| Cell41 || Cell42 ||
|-
| CEll51 || Cell52 ||
|-
| Cell61 || Cell62 ||
|-
| Cell71 || Cell72
|}

스크립트가 있습니다.

#!/bin/bash

isTable=0
beginTable="^\|\|"
lineNum=1

while IFS= read -r line
do
    echo "lineNum: $lineNum, line: $line, isTable: $isTable"
    if [[ $line =~ $beginTable ]]
    then
        if [ "$isTable" -eq "0" ]
        then
            isTable=1
            sed -r $lineNum's_\|\|_\{\|\n\|_' -i testPage #Begin table
            echo "begin table"
        else
            sed -r $lineNum's_^\|\|_\|-\n\|_' -i testPage #Define row ##DOESN'T WORK##
            echo "start of row"
        fi
    else
        if [ "$isTable" -eq "1" ]
        then
            isTable=0
            sed -r $lineNum's_(.*)$_\1\n\|\}\n_' -i testPage #End table ##WEIRD RESULT##
            echo "end table"
        fi
    fi
((lineNum++))
done < testPage

결과는 다음과 같습니다.

{|
| '''Title1''' || '''Title2''' || '''Title3''' ||
|-
| Cell11 || Cell12 || Cell13 ||
|-
| Cell21 || Cell22 ||
|-
| Cell31 || Cell32 ||
|| Cell41 || Cell42 ||
|}

|| CEll51 || Cell52 ||
|| Cell61 || Cell62 ||
|| Cell71 || Cell72 ||

루프가 적절한 줄과 줄 번호를 보고하고 적절한 논리와 일치하더라도 세 번의 반복 후에 교체가 중지되는 이유를 알 수 없습니다.

도움을 주시면 감사하겠습니다.

확실히 말하자면 testPage는 더 큰 파일의 일부이므로 sed시작 및 종료 플래그(예: 1온라인 및 에서 다른 작업 수행 $)가 작동하지 않습니다.

답변1

sed 's/||$/&\n|-/;s/^||/|/;1s/^/{|\n/;$s/-$/}/' file

Note는 \nGNU sed에서만 작동하므로

sed 's/||$/||\
|-/;s/^||/|/;1s/^/{|\
/;$s/-$/}/' file

답변2

나는 원하는 결과를 얻기 위해 답변의 조합을 사용했습니다.

#!/bin/bash

isTable=0
beginTable="^\|\|"
lineNum=1
tableCount=0

while IFS= read -r line #Print changes to temp file
do
    if [[ $line =~ $beginTable ]]
    then
        if [ "$isTable" -eq "0" ]
        then
            isTable=1
            ((tableCount++))
            > $1_$tableCount
            sed -n -r $lineNum's_^\|\|_\{\|\n\|_p' $1 >> $1_$tableCount #Begin table
            sed -r $lineNum's_^\|\|_@'$tableCount'@_' -i $1
        else
            sed -n -r $lineNum's_^\|\|_\|-\n\|_p' $1 >> $1_$tableCount #Define row
        fi
    else
        if [ "$isTable" -eq "1" ]
        then
            isTable=0
            sed -n -r $lineNum's_(.*)$_\1\|\}\n_p' $1 >> $1_$tableCount #End table
        fi
    fi
((lineNum++))
done < $1

for ((n=1;n<=$tableCount;n++))
do
    sed -e '/@'$n'@/r '$1'_'$n'' -e '/^@'$n'@/d;/^||/d' -i $1
    rm "$1"_"$n"
done

각 테이블을 다른 번호의 파일로 인쇄한 다음 sed각 테이블을 원본 파일로 읽습니다.

관련 정보