54340


次のようなデーターがあります。  
これを次のような条件でシェルスクリプトを用いて変換したいです

①一つ前の行に「&nbsp ;」がない数字は「--」をつける  
②ない場合はなにもつけない

[code]

    06
    &nbsp;
    26
    &nbsp;
    56
    07
    &nbsp;
    26
    &nbsp;
    54
    08
    &nbsp;
    27
    &nbsp;
    55
    10
    &nbsp;
    01
    11
    &nbsp;
    01
    12
    &nbsp;
    01
    13
    &nbsp;
    01
    &nbsp;
    52
    14
    &nbsp;
    52
    
[/code]

つまり、先程のものをこのように変更したいです。

[code]

    -06-
    26
    56
    -07-
    26
    54
    -08-
    27
    55
    -10-
    01
    -11-
    01
    -12-
    01
    -13-
    01
    52
    -14-
    52
    
[/code]

自分でもsedやtrを使って試行錯誤してみたのですがうまく行きませんでした。よろしくおねがいします。


CC BY-SA 4.0
2019-04-20T10:38:37.917
54338
2019-04-20T11:02:53.573
2019-04-20T10:47:31.830
3060
33004
question
linux bash
シェルスクリプトでの文字列の整形


以下のようなスクリプトを作成し、

[code]

    #!/bin/bash
    
    nbsp=false
    while read line; do
        if [ "${line}" == "&nbsp;" ]; then
            nbsp=true
        else
            if "${nbsp}"; then
                echo "${line}"
            else
                echo "-${line}-"
            fi
            nbsp=false
        fi
    done
    
[/code]

`cat test_data.txt | bash script.sh` のように標準入力から与えることで希望の出力を得られました。

コメントとして、1行前の状態を元に処理する必要があるため、`sed`などを利用して1行ずつ処理するよりも繰り返しの方が簡単に記述できる場合が多いです。


CC BY-SA 4.0
2019-04-20T10:59:46.303
54339
2019-04-20T10:59:46.303
29826
54338
answer


input.txt にテキストがあるとして、

[code]

    cat input.txt | sed -ne '/&nbsp;/{n; p; d;}; s/^\(.*\)$/-\1-/p'
    
[/code]


CC BY-SA 4.0
2019-04-20T11:02:53.573
54340
2019-04-20T11:02:53.573
754
54338
answer