如果该行仅包含数字,则删除前后的换行符
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
是做不到的。只有awk
、sed
吗?
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"
我有以下格式的字符串:
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
是做不到的。只有awk
、sed
吗?
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"