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 파일에 저장한 콜론 뒤의 두 번째 부분을 분리했습니다.

두 번째 단계에서는 첫 번째 부분을 콜론까지 분리하고 "-"를 "_"로 바꾸고 first_part_after_relacement 파일에 저장합니다.

붙여넣기 명령을 사용한 마지막 단계에서는 두 파일을 결합하여 원하는 결과를 얻었습니다.

주문하다

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단계가 더 추가되었습니다.

관련 정보