リードループ中に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 ||

ループが適切な行と行番号を報告し、適切なロジックと一致しても、3回の反復後に交換が停止する理由はわかりません。

助けてくれてありがとう。

確かに、testPageはより大きなファイルの一部であるため、sed開始フラグと終了フラグ(1オンラインや他のタスクの実行など$)は機能しません。

ベストアンサー1

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

Noteは\nGNU sedでのみ機能するため、

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

おすすめ記事