Text-Processing
將匹配行移動到立即下一行到匹配行的末尾
我有這樣的輸入,我需要將 *_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
你可以做:
sed '/_job/{N;/\ job_type/s/\ / /;}' infile
如果包含一行,
_job
則讀取N
ext 行並附加到模式空間並刪除嵌入的\n
ewline 字元(我們在這裡使用實際的換行符,用反斜杠將行分解,\
然後是實際的換行符)如果該行以job_type
.
使用 perl 以段落模式 (
-00
) 和 perl 的/m
regex 修飾符讀取文件,以便我們可以使用單個 regex 處理多行字元串:$ 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 的非貪婪正則表達式量詞?
,因此第一個擷取組只匹配 from_job:
到第一個換行符之前的所有內容_job:
(即該行的其餘部分)。順便說一句,如果有可能在行尾有尾隨空格
_job:
和/或行前有任何前導空格,請將正則表達式jobtype:
更改為\n``\s*\n\s*
與 一樣,如果您希望它修改原始文件而不是列印到標準輸出
sed
,則可以使用該選項。-i