如果该行仅包含数字,则删除前后的换行符

Remove line break before and after if the line only contains digits

我有以下格式的字符串:

ABC "123" (123)
Member
100
QWERTY
Parent
2
QWERTY

ABC "321" (12345)
Member
12
QWERTY

ABC "4321" (123456)
Member
12
QWERTY

并且从这个格式需要得到以下内容:

ABC "123" (123)
Member:100:QWERTY
Parent:2:QWERTY

ABC "321" (12345)
Member:12:QWERTY

ABC "4321" (123456)
Member:12:QWERTY

即如果该行仅包含一个数字,则删除前后的换行符。有没有最好的 cross-platform/POSIX 解决方案?据我了解,纯sh是做不到的。只有awksed吗?

perl 吸食模式:

perl -0000 -pe 's/\n([0-9]+)\n/::/g'  input-file

使用“pure sh”非常容易。一个简单的状态机就够了:

#!/bin/sh

nl='
'
state=0
while read -r line; do
    case "$state$line" in
        0*)          state=1 out="$line"        ;;
        1|1*[!0-9]*)         out="$out$nl$line" ;;
        2*)          state=1 out="$out$line"    ;;
        *)           state=2 out="$out:$line:"  ;;
    esac
done
printf '%s\n' "$out"