Text-Processing

將匹配行移動到立即下一行到匹配行的末尾

  • February 6, 2022

我有這樣的輸入,我需要將 *_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則讀取Next 行並附加到模式空間並刪除嵌入的\newline 字元(我們在這裡使用實際的換行符,用反斜杠將行分解,\然後是實際的換行符)如果該行以job_type.

使用 perl 以段落模式 ( -00) 和 perl 的/mregex 修飾符讀取文件,以便我們可以使用單個 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

引用自:https://unix.stackexchange.com/questions/689248