![Bash에서 추가 줄을 제거하는 가장 빠른 방법 또는 문자열이 #인 경우 마지막 줄](https://linux55.com/image/174816/Bash%EC%97%90%EC%84%9C%20%EC%B6%94%EA%B0%80%20%EC%A4%84%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94%20%EA%B0%80%EC%9E%A5%20%EB%B9%A0%EB%A5%B8%20%EB%B0%A9%EB%B2%95%20%EB%98%90%EB%8A%94%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%B4%20%23%EC%9D%B8%20%EA%B2%BD%EC%9A%B0%20%EB%A7%88%EC%A7%80%EB%A7%89%20%EC%A4%84.png)
bash
다음과 같은 경우 스크립트 끝에서 생성된 파일을 정리하는 우아한 방법을 찾고 있습니다 .
- 삭제할 줄 아래 줄의 첫 번째 문자는 다음과 같습니다.
#
또는 #
파일 마지막 줄의 첫 번째 문자입니다.
파일은 다음과 같습니다(참조 줄 번호는 에 []
있지만아니요파일 자체에서):
[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
N
newline
이 명령은 패턴 공간에 a와 다음 행을 추가합니다 .
패턴이 있는 행의 경우 ^#.*#.*
첫 번째 행을 삭제합니다.
${}
마지막 줄의 경우 패턴이 .*#.*
일치하는지 확인하고 마지막 부분을 제거합니다.
답변4
sed -n '/^#/{:a;h;n;//b a;H;g;};p' file
옵션은 -n
자동 인쇄를 비활성화하고 행은 p
작업에 따라 인쇄됩니다. /^#/{ ... }
– 로 시작하는 줄에서 #
일련의 작업을 수행합니다. :a
... b a
다음과 같은 루프를 설정합니다.
h
홀드 공간(즉, 현재 라인을 버퍼에 저장)을 패턴 공간으로 대체합니다.n
패턴 공간으로 입력의 다음 줄을 읽습니다(또는 더 이상 입력하지 않고 종료합니다).//b a
– 패턴 공간이 일치하면b
목초지로 이동합니다 . 에서 빈 정규식은 의 약어입니다.:a
/^#/
sed
apply the last used regex
루프가 완료된 후: H;g
– 현재 패턴 공간을 홀드 공간에 추가하고 패턴 공간을 홀드 공간으로 교체합니다. p
마지막으로 루프와 행이 아닌 다른 모든 결과를 인쇄합니다 #
.
#
결과: 줄 집합의 마지막 줄만 인쇄되고 #
끝 앞의 줄은 인쇄되지 않습니다.
# foo
bar1
bar2
bar3
#ar
ar1
ar2
ar3