Bash에서 추가 줄을 제거하는 가장 빠른 방법 또는 문자열이 #인 경우 마지막 줄

Bash에서 추가 줄을 제거하는 가장 빠른 방법 또는 문자열이 #인 경우 마지막 줄

bash다음과 같은 경우 스크립트 끝에서 생성된 파일을 정리하는 우아한 방법을 찾고 있습니다 .

  1. 삭제할 줄 아래 줄의 첫 번째 문자는 다음과 같습니다.# 또는
  2. #파일 마지막 줄의 첫 번째 문자입니다.

파일은 다음과 같습니다(참조 줄 번호는 에 []있지만아니요파일 자체에서):

[1] # foo
[2] bar1
[3] bar2
[4] bar3
[5] # foob
[6] #ar
[7] ar1
[8] ar2
[9] ar3
[10] #

위의 예에서는 5행과 10행을 삭제하고 싶습니다. 로 시작 #하는 줄 뒤에 로 시작하는 줄이 오는 것을 원하지 않으며 , #파일의 마지막 줄이 로 시작하는 것도 원하지 않습니다 #.

편집: 예상 출력:

[1] # foo
[2] bar1
[3] bar2
[4] bar3
[5] #ar
[6] ar1
[7] ar2
[8] ar3

bash가면서 스스로 가르쳐라훌륭한sed구문 과 혼동되지만 awk여기에 대한 답이 될 것 같습니다.

답변1

생각하다당신이 원하는 것은

sed -e '${/^#/d}' -e '$!N;/^#.*\n#/D' -e 'P;D' file
  • ${/^#/d}주소의 마지막 줄이 $일치하면 ^#삭제합니다 .

  • $!N... P;D스크롤을 유지하는 두 줄짜리 버퍼

  • /^#.*\n#/D#패턴의 시작 부분과 줄 바꿈 뒤에 이 있는 경우 줄 바꿈을 삭제하고 새 루프를 시작합니다.

답변2

sed요구사항은 표시된 대로 코딩될 수 있습니다.

sed -e '
  /^#/!b
  $d;N
  /\n#/D
' file
  • 관심이 없는 모든 행은 표준 출력으로 전송됩니다. 이는 인쇄를 의미합니다./^#/!b

  • 흥미로운 줄은 다음과 같이 시작됩니다.#

  • 흥미롭게도 마지막 줄이 삭제되었습니다.$d

  • 무의미한 줄은 코드의 두 번째 sed 줄에 나타날 수 없습니다.

  • 관심 있는 줄이 파일의 마지막 줄이 아닌 경우 다음 줄을 추가합니다.N

  • 다음 줄도 흥미롭다면 이전 줄을 삭제하고 기존 패턴 공간을 사용하여 sed 스크립트의 맨 위로 이동하세요. /\n#/D

사용되는 다양한 sed 명령에 대한 자세한 내용은 sed 매뉴얼을 참조하세요.

답변3

sed멀티라인 기술을 사용할 수 있습니다.

sed -E 'N;s/(^#.*)(#.*)/\2/;${s/(.*)(#.*)/\1/}' file

Nnewline이 명령은 패턴 공간에 a와 다음 행을 추가합니다 .

패턴이 있는 행의 경우 ^#.*#.*첫 번째 행을 삭제합니다.

${}마지막 줄의 경우 패턴이 .*#.*일치하는지 확인하고 마지막 부분을 제거합니다.

답변4

sed -n '/^#/{:a;h;n;//b a;H;g;};p' file

옵션은 -n자동 인쇄를 비활성화하고 행은 p작업에 따라 인쇄됩니다. /^#/{ ... }– 로 시작하는 줄에서 #일련의 작업을 수행합니다. :a... b a다음과 같은 루프를 설정합니다.

  • h홀드 공간(즉, 현재 라인을 버퍼에 저장)을 패턴 공간으로 대체합니다.
  • n패턴 공간으로 입력의 다음 줄을 읽습니다(또는 더 이상 입력하지 않고 종료합니다).
  • //b a– 패턴 공간이 일치하면 b목초지로 이동합니다 . 에서 빈 정규식은 의 약어입니다.:a/^#/sedapply the last used regex

루프가 완료된 후: H;g– 현재 패턴 공간을 홀드 공간에 추가하고 패턴 공간을 홀드 공간으로 교체합니다. p마지막으로 루프와 행이 아닌 다른 모든 결과를 인쇄합니다 #.

#결과: 줄 집합의 마지막 줄만 인쇄되고 #끝 앞의 줄은 인쇄되지 않습니다.

# foo
bar1
bar2
bar3
#ar
ar1
ar2
ar3

관련 정보