sed에 "상세 모드" 또는 "디버그 모드"를 적용할 수 있는 방법이 있나요?

sed에 "상세 모드" 또는 "디버그 모드"를 적용할 수 있는 방법이 있나요?

gnu sed실행한 내용과 완료된 내용을 상세하게 표시할 수 있는 방법이 있나요 ?
스크립트가 실행되기 전과 후에 각 입력 줄에 대해 예약된 공간과 패턴 공간 등의 내용을 볼 수 있도록 "디버그 모드"와 같은 것을 원합니다.

답변1

~처럼프라산 언급하다, GNU sed도입--debug예를 들어 다음을 실행하면 버전 4.6의 옵션이 거의 필요합니다.

printf '%s\n' one two  | sed --debug 'H;1h;$x;$s/\n/_/g'

출력은 다음과 같습니다

SED PROGRAM:
  H
  1 h
  $ x
  $ s/\n/_/g
INPUT:   'STDIN' line 1
PATTERN: one
COMMAND: H
HOLD:    \none
COMMAND: 1 h
HOLD:    one
COMMAND: $ x
COMMAND: $ s/\n/_/g
END-OF-CYCLE:
one
INPUT:   'STDIN' line 2
PATTERN: two
COMMAND: H
HOLD:    one\ntwo
COMMAND: 1 h
COMMAND: $ x
PATTERN: one\ntwo
HOLD:    two
COMMAND: $ s/\n/_/g
MATCHED REGEX REGISTERS
  regex[0] = 3-4 '
'
PATTERN: one_two
END-OF-CYCLE:
one_two

어떤 배포판을 사용하고 있는지 모르겠지만 이 버전의 sed(또는 그 이상)를 사용할 수 있습니다.데비안 10에서,우분투 19.04에서및 파생 상품은 Fedora 33에서 사용할 수 있습니다.

답변2

개인적으로 sed에서 "자세한 출력"이라고 생각하는 것, 즉 "sed가 수행하는 작업"을 얻는 것이 약간 까다롭다는 것을 알았습니다.

인수가 생략되면 -i편집된 결과 스트림이 콘솔에 직접 인쇄됩니다. 입력 파일/스트림이 길거나 과도한 편집 또는 사소한 편집을 수행하는 경우 이는 별로 도움이 되지 않습니다.

Stephen이 지적했듯이 --debug옵션은 다음과 같이 알려줍니다.모든 것sed가 하고 있어요. 즉, 각 입력 줄을 인쇄하여 파일 줄에서 실행한 모든 명령, 해당 명령의 결과 및 편집된 줄을 알려줍니다. 내 경험으로는 너무 장황하다. 나는 보통 내부 검색 및 교체에 sed를 사용합니다. 1450줄 파일에서 단일 정규식 대체를 실행하면 약 8700줄의 출력이 생성됩니다. 꽤 친숙하고 읽을 가치가 있습니다. 하지만 창의적인 grep을 사용하면 더 많은 정보를 얻을 수 있습니다.

정규식 검색 및 바꾸기의 경우 다음이 매우 유용합니다.

sed --debug -e 's/pattern/replacement/' file.txt | grep -B 3 -A 4 -P '^MATCHED'

정규식 명령이 일치할 때마다 디버그 출력은 "MATCHED"로 시작하는 줄을 인쇄합니다. 이는 각 일치 항목에 대한 8줄 중 네 번째 줄로, sed가 수행한 작업을 알려줍니다. 따라서 include는 -B 3 -A 4sed가 실제로 변경한 줄 그룹만 인쇄하고 변경되지 않은 모든 입력 줄에 대해 8줄을 인쇄하지 않습니다.

분명히 정규식 대체 외에 sed를 사용하여 다른 작업을 수행할 수 있으므로 사용 사례와 명령에 맞게 수정해야 하지만 이 접근 방식을 사용하면 출력을 --debug더 유용한 콘텐츠로 줄일 수 있다고 생각합니다. 즉, cp, mv 등과 같은 다른 유틸리티를 기반으로 하는 자세한 플래그가 필요합니다.

관련 정보