需要在下一行之前添加空格或换行符,如果下一行以空白开头,则必须忽略。
我的输入文件如下所示
#qwert TRWQQA 01 40 /* this is the sample test */
/* STILL COMING UP... AFTER UP ENQ GOES AWAY */
/* FEB AND 30TH */
#TFCDF DWERTY 01 40 (FEB AND 30TH)
/* AND (qwert-01 01 #qwert OR */
/* (START SCD RTGFG))
XDYGH #qwert */
#HYUOIK YUPOIH 01 40 FEB AND 30TH
/* AND (qwert-01 01 #qwert OR */
/* (START SCD qwert))
SDFGH #qwert */
#NHUYUOI GHTYHD 01 40 (FEB AND 30TH) AND (qwert-01 01 #qwert OR
(START SCD SDFRE))
#KJYY ERTYUB 01 40 (FEB AND 30TH) AND (qwert-01 03 #qwert OR
(START SCD DERF))
RTYUH POMHY 01 40 ERTYUJ RTYUJ
QWERG PIJHGV 01 40 MNBV LKJH
预期输出。
#qwert TRWQQA 01 40 /* this is the sample test */
/* STILL COMING UP... AFTER UP ENQ GOES AWAY */
/* FEB AND 30TH */
#TFCDF DWERTY 01 40 (FEB AND 30TH)
/* AND (qwert-01 01 #qwert OR */
/* (START SCD RTGFG))
XDYGH #qwert */
#HYUOIK YUPOIH 01 40 FEB AND 30TH
/* AND (qwert-01 01 #qwert OR */
/* (START SCD qwert))
SDFGH #qwert */
#NHUYUOI GHTYHD 01 40 (FEB AND 30TH) AND (qwert-01 01 #qwert OR
(START SCD SDFRE))
#KJYY ERTYUB 01 40 (FEB AND 30TH) AND (qwert-01 03 #qwert OR
(START SCD DERF))
RTYUH POMHY 01 40 ERTYUJ RTYUJ
QWERG PIJHGV 01 40 MNBV LKJH **strong text**
答案1
使用任何 POSIX awk:
$ awk '{print (/^[[:blank:]]/ ? "" : sep) $0; sep=ORS}' file
#qwert TRWQQA 01 40 /* this is the sample test */
/* STILL COMING UP... AFTER UP ENQ GOES AWAY */
/* FEB AND 30TH */
#TFCDF DWERTY 01 40 (FEB AND 30TH)
/* AND (qwert-01 01 #qwert OR */
/* (START SCD RTGFG))
XDYGH #qwert */
#HYUOIK YUPOIH 01 40 FEB AND 30TH
/* AND (qwert-01 01 #qwert OR */
/* (START SCD qwert))
SDFGH #qwert */
#NHUYUOI GHTYHD 01 40 (FEB AND 30TH) AND (qwert-01 01 #qwert OR
(START SCD SDFRE))
#KJYY ERTYUB 01 40 (FEB AND 30TH) AND (qwert-01 03 #qwert OR
(START SCD DERF))
RTYUH POMHY 01 40 ERTYUJ RTYUJ
QWERG PIJHGV 01 40 MNBV LKJH
答案2
用于awk
在不以空白开头的每行之前添加一行(但避免在第一行中这样做):
awk 'NR != 1 && /^[^[:blank:]]/ { print "" }; 1' file
该命令使用两个测试。如果两个测试都是真的,插入一个空行。
- 测试
NR != 1
是真的如果当前行不是第一行。这确保了如果第一行以非空白开头,我们不会在输出的开头添加空白行。 - 测试
/^[^[:blank:]]/
是真的如果当前行以非空白字符开头。此处,“空白字符”表示空格或制表符,根据您的区域设置,一组可能包含其他空白字符。
尾随1
导致无条件输出当前行(它是 的简写{ print }
)。
答案3
像这样,使用 GNU awk
:
$ awk 'NR > 1 && /^\S/{print ""}1' file
NR > 1
在第一行之后开始以避免第一行换行&&
和/^\S/
从非空白开始print ""
如果满足所有条件则打印换行符1
print
真实条件下的简写
输出
#qwert TRWQQA 01 40 /* this is the sample test */
/* STILL COMING UP... AFTER UP ENQ GOES AWAY */
/* FEB AND 30TH */
#TFCDF DWERTY 01 40 (FEB AND 30TH)
/* AND (qwert-01 01 #qwert OR */
/* (START SCD RTGFG))
XDYGH #qwert */
#HYUOIK YUPOIH 01 40 FEB AND 30TH
/* AND (qwert-01 01 #qwert OR */
/* (START SCD qwert))
SDFGH #qwert */
#NHUYUOI GHTYHD 01 40 (FEB AND 30TH) AND (qwert-01 01 #qwert OR
(START SCD SDFRE))
#KJYY ERTYUB 01 40 (FEB AND 30TH) AND (qwert-01 03 #qwert OR
(START SCD DERF))
RTYUH POMHY 01 40 ERTYUJ RTYUJ
QWERG PIJHGV 01 40 MNBV LKJH
答案4
使用perl
您可以将换行符添加到一系列序列中换行然后不是空格:
perl -e 'local $/; $_ = <>; s/(\n[^[:space:]])/\n$1/g; print' file