匹配字符串并将行移动到之前的行

匹配字符串并将行移动到之前的行

我有一个大文件,其中重复有此信息。不幸的是,它使用固定终端来对文件进行换行。我需要匹配任何内容172并将其移动到上面的行

wsmith 623456256 6-meg
   172.16.15.198 pppoe

输出需要是

wsmith 623456256 6-meg  172.16.15.198 pppoe

我无法使用 awk 并简单地移动第二行,因为文件中还有其他行的格式不正确。

答案1

sed

sed '/^[[:blank:]]*172/ !{ N;s/\n[[:blank:]]*/ /; };' infile

答案2

使用ed编辑器,该命令g/172/-1,.j会将包含(子)字符串的任何行172与上一行连接起来。

接下来,p将把整个缓冲区打印到标准输出(并Q退出而不保存):

$ cat file
wsmith 623456256 6-meg
   172.16.15.198 pppoe
$ printf '%s\n' 'g/172/-1,.j' ',p' 'Q' | ed -s file
wsmith 623456256 6-meg   172.16.15.198 pppoe

为了使匹配更加具体,仅匹配以可选空格和/或制表符和字符串开头的行172.

$ printf '%s\n' 'g/^[[:blank:]]*172\./-1,.j' ',p' 'Q' | ed -s file
wsmith 623456256 6-meg   172.16.15.198 pppoe

要保存到新文件,请重定向结果。要进行就地编辑,请将,pQ命令替换为单个wq命令。

答案3

这应该可以满足您的需要:

文件:

wsmith 623456256 6-meg
 172.16.15.198 pppoe
wfwe fw efwe fw ef
fkp e
kswsmith 623456256 6-meg
  172.16.15.198 pppoe
wsmith 623456256 6-meg
  172.16.15.198 pppoe
ef
efwef w ef w efwef
wewsmith 623456256 6-meg
 172.16.15.198 pppoe
efwef
uiwsmith 623456256 6-meg
172.16.15.198 pppoe
awk 'BEGIN{set=0} NR>1 && /^ *172/{ print line,$0; set=1; next }
 NR>1 && !/^ *172/ && set==0{print line} {line=$0; set=0}' file

输出:

wsmith 623456256 6-meg  172.16.15.198 pppoe
wfwe fw efwe fw ef
fkp e 
kswsmith 623456256 6-meg   172.16.15.198 pppoe
wsmith 623456256 6-meg   172.16.15.198 pppoe
ef
efwef w ef w efwef
wewsmith 623456256 6-meg  172.16.15.198 pppoe
efwef
uiwsmith 623456256 6-meg 172.16.15.198 pppoe

相关内容