sed を使用して、コロンの左側に表示されるすべてのダッシュを置き換えます。

sed を使用して、コロンの左側に表示されるすべてのダッシュを置き換えます。

ファイルには次の値がありますconfig.yml

scratch-org-def: config/project-scratch-def.json
assign-permset: false
permset-name: 
run-apex-tests: true
apex-test-format: tap
delete-scratch-org: false
show-scratch-org-url: true

コロン(:)の左側に表示されるすべてのダッシュ(-)を下線(_)に置き換える必要があります。

私はこれを試しましたが、sed '/.*: /s/-/_/g' config.ymlすべてのダッシュ(含む)を置き換えますconfig/project-scratch-def.json

コロンで止まることを望みながら試してみましたが、sed '/^[^:]*:/s/-/_/g' config.yml効果は同じです。

答え1

$ awk '{ gsub("-", "_", $1) } 1' FS=':' OFS=':' config.yml
scratch_org_def: config/project-scratch-def.json
assign_permset: false
permset_name:
run_apex_tests: true
apex_test_format: tap
delete_scratch_org: false
show_scratch_org_url: true

スクリプトは、 - で区切られた一連のフィールドawkにファイルを読み込みます。各行の最初のフィールドで:機能し、gsub()各ダッシュを下線に変更します。各(現在変更された)入力行ごとに別々の1略語が{ print }印刷されます。

FS=':' OFS=':'入力フィールドと出力フィールドの区切り記号をに設定します:

非常に複雑な正規表現を使用したり、予約されたスペース(またはその両方)を利用してこれを実行することも可能ですsedが、「すぐに使用可能な」ソリューションではありません。


(考えた後)以下を使用してくださいsed

$ sed 'h;s/^[^:]*//;x;s/:.*$//;y/-/_/;G;s/\n//' config.yml
scratch_org_def: config/project-scratch-def.json
assign_permset: false
permset_name:
run_apex_tests: true
apex_test_format: tap
delete_scratch_org: false
show_scratch_org_url: true

各ステップの指示:

  1. h:パターンスペース(現在の入力ライン)を保持スペース(「標準」バッファ)にコピーします。
  2. s/^[^:]*//::パターン空間の最初のパターンより前のすべての項目を削除します。
  3. x:ホールドスペースとパターンスペースを交換します。
  4. s/:.*$//:パターンスペースの内外をすべて削除します。

    パターンスペースには未修正の左が含まれ:、ホールドスペースにはを含む未変更の右が含まれます:

  5. y/-/_/:パターン空間のすべてのダッシュを下線に変更します。

  6. G:間に改行文字を使用して、パターンスペースの末尾に予約済みスペースを追加します。
  7. s/\n//:前の手順で改行文字を削除します。
  8. (暗黙的p):パターンスペースを標準出力として印刷します。

ステップ 4 と 5 は、結果に何の変化もなく互いに変更することができます。

簡単に言えば、sed作業に適したツールではありません(おそらくではありません)。

答え2

考えるsedループ内でダッシュを交換し、最初のコロンにダッシュが含まれていないすべてのアイテムを一時停止します。

sed ':a; /^[^-:]*:/b; s/-/_/;ta'

前任者。

$ sed ':a; /^[^-:]*:/b; s/-/_/;ta' config.xml 
scratch_org_def: config/project-scratch-def.json
assign_permset: false
permset_name: 
run_apex_tests: true
apex_test_format: tap
delete_scratch_org: false
show_scratch_org_url: true

答え3

3段階で結果を得ました

まず、Second_part.txtファイルに保存したコロンの後の2番目の部分を分離しました。

2番目のステップでは、最初の部分をコロンまで分離し、「-」を「_」に置き換えて、first_part_after_relacementファイルに保存します。

貼り付けコマンドを使用した最後のステップでは、2つのファイルを組み合わせて目的の結果を得ました。

注文する

sed -ne "s/\(.*:\)\(.*\)/\2/p" l.txt > Second_part.txt
sed -ne "s/\(.*:\)\(.*\)/\1/p" l.txt | sed "s/-/_/g" > first_part_after_relacement
paste first_part_after_relacement Second_part.txt | sed  -r "s/\s+//g"

出力

scratch_org_def:config/project-scratch-def.json
assign_permset:false
permset_name:
run_apex_tests:true
apex_test_format:tap
delete_scratch_org:false
show_scratch_org_url:true

注:以前に提供されたソリューションと比較して、さらに2つのステップが追加されました。

関連情報