我有一个大文件,其中重复有此信息。不幸的是,它使用固定终端来对文件进行换行。我需要匹配任何内容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
要保存到新文件,请重定向结果。要进行就地编辑,请将,p
和Q
命令替换为单个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