将匹配的行移动到紧邻下一行到匹配行的末尾

将匹配的行移动到紧邻下一行到匹配行的末尾

我有这样的输入,如果是 job_type ,我需要将 *_job 之后的行移动到 *_job 行的末尾并打印整个文件。如果下一行不是 job_type,则打印它们。

我只能通过 SED 打印包含 *_job 的行,但不能打印整个文件,有人可以帮助我吗?

 sed -i -n '/.*_job: .*/{h}; /job_type.*/{H;x;s/\n/ /;p}'

输入。

update_job: YUHG_GHT_FGT_BOX
job_type: box
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXXXXX
insert_job: TYYUH_JYUH_BOX
job_type: cmd
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX
insert_job: TYU_hju_poonj
job_type: CMD
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX

insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

insert_job: YU_opoj_BOX
job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

预期 O/P:-

update_job: YUHG_GHT_FGT_BOX job_type: box
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXXXXX
insert_job: TYYUH_JYUH_BOX job_type: cmd
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX
insert_job: TYU_hju_poonj job_type: CMD
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX

insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

答案1

你可以做:

sed '/_job/{N;/\
job_type/s/\
/ /;}' infile

如果包含一行,_job则读取Next 行并附加到模式空间,并删除嵌入的\newline 字符(我们在这里使用实际的换行符,通过用反斜杠分解该行,\然后使用实际的换行符)如果该行以job_type.

答案2

使用perl以段落模式( )读取文件-00并使用perl的/m正则表达式修饰符,以便我们可以使用单个正则表达式处理多行字符串:

$ perl -00 -p -e 's/(_job:.*?)\n(job_type:)/$1 $2/mg' input.txt
update_job: YUHG_GHT_FGT_BOX job_type: box
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXXXXX
insert_job: TYYUH_JYUH_BOX job_type: cmd
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX
insert_job: TYU_hju_poonj job_type: CMD
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX

insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX

_job:这有效地替换了包含和任何内容的行之间的换行符紧随其后以 , 开头的行job_type,带有一个空格。与该确切标准不匹配的行将保持原样,不变。

它使用两个捕获组,(_job:.*?)(job_type:),以及perl的非贪婪正则表达式量词?,以便第一个捕获组仅匹配从到_job:之前的所有内容第一的之后换行_job:(即该行的其余部分)。

顺便说一句,如果行尾可能有尾随空格_job:和/或jobtype:行前有任何前导空格,请将\n正则表达式更改为\s*\n\s*

与 一样,如果您希望它修改原始文件而不是打印到标准输出,sed则可以使用该选项。-i

答案3

Perl 中的简单:

perl -pi -e 'tr/\n/ / if /_job/' -- file
  • -p逐行读取输入并在处理后打印每一行
  • -i就地更改文件
  • tr/\n/ /用空格替换换行符
  • if /_job/仅当条件为真(即该行包含_job.

答案4

ed

printf '%s\n' 'g/^job_type:/ s/^/ /\' '-1,.j' ',p' 'Q' | ed -s file

编辑脚本:

g/^job_type:/ s/^/ /\
-1,.j
,p
Q

这会将替换命令 ( s) 和连接命令 ( j) 应用于编辑缓冲区中以文字字符串开头的所有行job_type:。替换在行的开头插入一个空格,而 join 命令将受影响的行与缓冲区中的前一行连接起来。

尾随的pQ命令将修改后的缓冲区打印到终端并退出。wq如果您希望进行就地编辑,您可以将它们更改为将结果写回原始文件。

相关内容