我有这样的输入,我需要将 *_job 之后的行移动到 *_job 行的末尾,如果它是 job_type 并打印整个文件。如果下一行不是 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
你可以做:
如果包含一行,
_job
则读取N
ext 行并附加到模式空间并删除嵌入的\n
ewline 字符(我们在这里使用实际的换行符,用反斜杠将行分解,\
然后是实际的换行符)如果该行以job_type
.使用 perl 以段落模式 (
-00
) 和 perl 的/m
regex 修饰符读取文件,以便我们可以使用单个 regex 处理多行字符串:_job:
这有效地替换了包含的行和任何紧随其后的以 开头的行之间的换行符job_type
,并带有一个空格。与该确切标准不匹配的行保持原样不变。它使用两个捕获组,
(_job:.*?)
和(job_type:)
,以及 perl 的非贪婪正则表达式量词?
,因此第一个捕获组只匹配 from_job:
到第一个换行符之前的所有内容_job:
(即该行的其余部分)。顺便说一句,如果有可能在行尾有尾随空格
_job:
和/或行前有任何前导空格,请将正则表达式jobtype:
更改为\n
\s*\n\s*
与 一样,如果您希望它修改原始文件而不是打印到标准输出
sed
,则可以使用该选项。-i
在 Perl 中很简单:
-p
逐行读取输入并在处理后打印每一行-i
更改文件到位tr/\n/ /
用空格替换换行符if /_job/
仅在条件为真时运行命令,即如果该行包含_job
.鉴于您发布的示例输入/输出,听起来您想要执行以下操作,在每个 Unix 机器上的任何 shell 中使用任何 awk:
与
ed
:编辑脚本:
这会将替换命令 (
s
) 和连接命令 (j
) 应用于编辑缓冲区中以文字字符串开头的所有行job_type:
。替换在行首插入一个空格,并且 join 命令将受影响的行与缓冲区中的前一行连接起来。尾随
p
和Q
命令将修改后的缓冲区打印到终端并退出。wq
如果您希望进行就地编辑,您可以更改这些以将结果写回原始文件。