パターンマッチング後の行を次の行に分割

パターンマッチング後の行を次の行に分割

以下に示す入力ファイルで文字列を見つけようとしますがjob_type、job_typeと一致すると次の行に移動します。

私はこれを試しましたが、うまくいきません。

sed "s/[A-Z][a-z]*job_type:/\njob_type:/g"

入力する:

    insert_job: VAU_vaultnotification_ertgvfg_job job_type: xxx 
    insert_job: VAU_vaultnotification_ertgvfg_frd job_type: yyy 
    insert_job: VAU_vaultnotification_ertgvfg_erb job_type: SXC 
     job_type: CMD
    insert_job: VAU_vaultnotification_ertgvfg_frd job_type: YUI 

予想出力:

insert_job: VAU_vaultnotification_ertgvfg_job 
job_type: xxx 
insert_job: VAU_vaultnotification_ertgvfg_frd 
job_type: yyy 
insert_job: VAU_vaultnotification_ertgvfg_erb 
job_type: SXC 
 job_type: CMD
insert_job: VAU_vaultnotification_ertgvfg_frd 
job_type: YUI 

答え1

あなたが何を求めているのかはよくわかりませんが、おそらくあなたは以下が欲しいでしょう:

sed 's/\([[:upper:]][[:alpha:]_]*\)[[:space:]]\{1,\}\(job_type:\)/\1\
\2/g'

または:

perl -Mopen=locale -pe 's/\b\p{Lu}\w*\K\s+(job_type:)/\n$1/g'

答え2

私は同様のことをするためにGNUを使いますsed

sed '/insert_job/s/job_type/\njob_type/'

最初の部分は/insert_job/交換前のラインと一致します。 「insert_job」(または希望する正規表現)が見つからない場合、置換は行われません。

答え3

GNUの使用sed

$ sed '/ \+\(insert_job.*\)\(job_type:.*\)/s//\1\n\2/' input_file
insert_job: VAU_vaultnotification_ertgvfg_job
job_type: xxx
insert_job: VAU_vaultnotification_ertgvfg_frd
job_type: yyy
insert_job: VAU_vaultnotification_ertgvfg_erb
job_type: SXC
     job_type: CMD
insert_job: VAU_vaultnotification_ertgvfg_frd
job_type: YUI

答え4

使用幸せ(以前のPerl_6)

変更されるすべての行にスペースで区切られた「列」が4つ以上含まれているとします。 「列」が4つ未満の行は、変更されていない状態で返されます。

raku -ne 'my @a = .words; @a.elems >= 4 ?? put @a[0..1], "\n", @a[2..*] !! put @a;' 

上記は、入力に文字列パターンがなく、適切な数の空白区切り文字words(列など)があると想定しています。一致する行の場合、最初の2つの列を返し、改行、残りの列を返します(OPは、文字列がjob_type3番目の列から始まる入力の例を提供しました)。

ただし、正規表現を使用して文字列パターンを検索したい場合は、Rakuがサポートします(subst演算子を使用)。以下では、Rakuは、文字列の先頭と文字列の終わりの幅がゼロのアサーション(アンカー)/ ^ ... $ /の間で8つの正規表現原子を検索します。一致が行われると、Rakuのキャプチャフラグは一致前のすべてのエントリを削除するために使用されます。その後、置き換えられた半分で改行文字が一致変数に関連付けられて返されます。^$<(job_typesubst\n~$/

raku -ne '.subst(/^ insert_job\: \s .+? \s <(job_type\: \s \w* \s*? $/, {"\n"~$/} ).put;'

入力例:

insert_job: VAU_vaultnotification_ertgvfg_job job_type: xxx 
insert_job: VAU_vaultnotification_ertgvfg_frd job_type: yyy 
insert_job: VAU_vaultnotification_ertgvfg_erb job_type: SXC 
 job_type: CMD
insert_job: VAU_vaultnotification_ertgvfg_frd job_type: YUI

出力例(上記の最初のコード例):

insert_job: VAU_vaultnotification_ertgvfg_job
job_type: xxx
insert_job: VAU_vaultnotification_ertgvfg_frd
job_type: yyy
insert_job: VAU_vaultnotification_ertgvfg_erb
job_type: SXC
job_type: CMD
insert_job: VAU_vaultnotification_ertgvfg_frd
job_type: YUI

OPでは、すべての出力を左揃えする必要があるか(先行空白文字0個)かどうかは明確に明らかにされていません。上記の最初の答えは左揃えですが、出力で次に始まるすべての行をインデントするのはtrim簡単です(たとえば、2番目の答えで置換を使用するとインデントされます)。job_type{"\n "~$/}

https://raku.org

関連情報