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



我有以下格式的字符串:

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

。如果一行仅由一个数字组成,则删除该行前后的换行符。有没有最好的跨平台/POSIX解决方案?据我所知,纯sh是做不到的。是否只有awk,sed?

使用"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 '%sn' "$out"

perl在slurp模式:

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

最新更新