我有这样的输入,如果是 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
则读取N
ext 行并附加到模式空间,并删除嵌入的\n
ewline 字符(我们在这里使用实际的换行符,通过用反斜杠分解该行,\
然后使用实际的换行符)如果该行以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 命令将受影响的行与缓冲区中的前一行连接起来。
尾随的p
和Q
命令将修改后的缓冲区打印到终端并退出。wq
如果您希望进行就地编辑,您可以将它们更改为将结果写回原始文件。