>我有一个这样的文件:
123456789012345lksdlkssalkd
skdañsldkasñldkas+
slkdñlaskd aslda lkl
012345678901234dkfskadflkdflkasdf
ASLÑsa sLL SLD SdsDA
SLDALDK LÑD
SDFSADF
d
345678901234560 DÑLSAD SDLÑSlkfl fg fg kfglkfgklfd gf
lfdld
我想要这个结果,每行以 15 个数字开头,并用空格替换中间行尾:
123456789012345lksdlkssalkd skdañsldkasñldkas+ slkdñlaskd aslda lkl
012345678901234dkfskadflkdflkasdf ASLÑsa sLL SLD SdsDA SLDALDK LÑD SDFSADF d
345678901234560 DÑLSAD SDLÑSlkfl fg fg kfglkfgklfd gf lfdld
可能吗?
你可以做:
$ awk '/^[[:digit:]]{15}/{if (buf) {print buf} buf=$0; next}
{buf=buf FS $0}
END {print buf}' file
123456789012345lksdlkssalkd skdañsldkasñldkas+ slkdñlaskd aslda lkl
012345678901234dkfskadflkdflkasdf ASLÑsa sLL SLD SdsDA SLDALDK LÑD SDFSADF d
345678901234560 DÑLSAD SDLÑSlkfl fg fg kfglkfgklfd gf lfdld
可以在sed
的帮助下简化
$ sed -r 's/[0-9]{15}/n&/' file |
awk -v RS= -v ORS='n' '$1=$1'
123456789012345lksdlkssalkd skdañsldkasñldkas+ slkdñlaskd aslda lkl
012345678901234dkfskadflkdflkasdf ASLÑsa sLL SLD SdsDA SLDALDK LÑD SDFSADF d
345678901234560 DÑLSAD SDLÑSlkfl fg fg kfglkfgklfd gf lfdld
我最喜欢我的解决方案:没有分支,没有 sed,
awk '/^[0-9]{15}/ && NR > 1 {sep="n"}
{printf "%s%s", sep, $0; sep = " "} END {print ""}' dat
123456789012345lksdlkssalkd skdañsldkasñldkas+ slkdñlaskd aslda lkl
012345678901234dkfskadflkdflkasdf ASLÃsa sLL SLD SdsDA SLDALDK LÃD SDFSADF d
345678901234560 DÃLSAD SDLÃSlkfl fg fg kfglkfgklfd gf lfdld
- 只要匹配 15 位模式,请将分隔符设置为换行符,第 1 行除外。
- 打印任何带有前导分隔符的输入行,并将分隔符设置为空格。
- 在末尾打印换行符。
这可能对你有用(GNU sed(:
sed -r ':a;N;/n[0-9]{15}/!s/n/ /;ta;P;D' file
将换行符替换为空格,除非该换行符前面有 15 个字符。