현재 다음과 같은 섹션이 포함 된 파일이 있습니다.
code statement1 code statement2 # BEGIN SOMENAME some code some other code # END SOMENAME code statement n +1 code statement n +1
제가하고 싶은 것은 “# BEGIN SOMENAME”과 “# END”사이에있는 내용을 주석 처리하여 결국 다음과 같이 보이도록하는 것입니다.
code statement1 code statement2 # BEGIN SOMENAME # some code # some other code # END SOMENAME code statement n +1 code statement n +1
awk 또는 sed로이 작업을 수행 할 수 있습니까? 쉽게 되돌릴 수 있습니까? 다시 “주석”하는 작업 만 수행 할 수 있습니까?
실수를 피하기 위해 내가 원하는 것은 이미 주석 처리 된 줄은 그대로 두어야합니다. 또한 “comment in”에서 끝과 시작 사이의 줄이 “#”로 시작하지 않으면 뭔가를 시도해서는 안됩니다.
지금 몇 시간 동안 시도했지만 성공하지 못했습니다.
가능한 해결책을 찾았습니다.
awk " BEGIN { i=0; line_with_no_comment_found=0 } /^# END/ { m=0; if ( line_with_no_comment_found == 1 ) { for (var in a) print "# "a[var] } else { for (var in a) print a[var] } delete a; i=0; line_with_no_comment_found=0; } /^# / { if (m==0) { print } else { a[i++]=$0; } } !/^# / { if (m==0) { print } else { a[i++]=$0; line_with_no_comment_found=1} } /^# BEGIN ([a-zA-Z_])([1-9][0-9]*)*/ {m=1;} END { } "<<EOF
댓글
- 이전 코드가 여러 개의 시작 줄 (버그 복사 / 붙여 넣기 …?)과 같은 실수가 있으며, 처음 줄을 무시하거나 시작이 시작되고 파일이 끝날 때가 있습니다 …. i '이 스크립트를 게시하지 않는 것이 좋습니다. 지금은 경쟁적으로 깨졌습니다 ….
- 당신이 맞습니다. 이것을 도전에 추가했습니다. 피곤해서 죄송합니다. 부분적인 해결책을 찾았을 때 항상 다른 것들이 작동하지 않는 것 같습니다.
답변
이 스크립트는 저에게 효과적입니다. GNU Awk 4.0.1에서 테스트했지만 Nawk에서도 작동합니다.
awk "BEGIN { # action=0: uncomment # action=1: comment action=0 in_optional_code_block=0 } { if ($0 ~ /^# BEGIN/) { in_optional_code_block=1 } else if ($0 ~ /^# END/) { in_optional_code_block=0 } else if (in_optional_code_block) { if (action) { if ($0 !~ /^#/) { $0 = "# " $0 } } else { if ($0 ~ /^#/) { sub(/^# ?/, "") } } } } 1"
또한 작은 수반되는 쉘 스크립트를 작성했습니다.
#!/usr/bin/env sh syntax_error() { echo "Usage: `basename \"$0\"` [comment|uncomment] file" >&2 exit 1 } case "$1" in 0|uncomment) action=0; ;; 1|comment) action=1; ;; *) syntax_error; ;; esac shift if [ -z "$@" ]; then syntax_error; fi awk "BEGIN { action="$action" in_optional_code_block=0 } { if ($0 ~ /^# BEGIN/) { in_optional_code_block=1 } else if ($0 ~ /^# END/) { in_optional_code_block=0 } else if (in_optional_code_block) { if (action) { if ($0 !~ /^#/) { $0 = "# " $0 } } else { if ($0 ~ /^#/) { sub(/^# ?/, "") } } } } 1" "$@" > "[email protected]" if [ $? -eq 0 ]; then mv "[email protected]" "$@"; fi
(GNU Awk 4.1.0 이상이있는 경우 마지막에 이동 구성 대신 -i 플래그를 사용할 수 있습니다.)
댓글
- @Mandragor 여는 댓글과 닫는 댓글의 SOMENAME이 일치해야하는 경우 소리 쳐주세요.