![파일/파이프에서 공통 초기 공백 찾기(및 제거)](https://linux55.com/image/6802/%ED%8C%8C%EC%9D%BC%2F%ED%8C%8C%EC%9D%B4%ED%94%84%EC%97%90%EC%84%9C%20%EA%B3%B5%ED%86%B5%20%EC%B4%88%EA%B8%B0%20%EA%B3%B5%EB%B0%B1%20%EC%B0%BE%EA%B8%B0(%EB%B0%8F%20%EC%A0%9C%EA%B1%B0).png)
텍스트 스트림이나 파일에서 일반적인 초기 공백을 찾아서 제거하는 방법을 찾고 있습니다. 삭제하고 싶지 않아요모두선행 공백(간단한 공백입니다 sed 's/^[[:space:]]*//'
). 모두에게 공통되는 금액만하지만 빈 줄.
예:
printf ' some text\n\n some more text\n' | the_awesome_command_or_script
인쇄해야 함
some text
some more text
진전:
awk
쉘 while
루프와 같은 도구를 사용하여 먼저 모든 줄을 반복하고 초기 공백을 계산한 다음 동적으로 생성된 sed 명령을 사용하여 공백을 제거할 수 있다는 것을 알고 있습니다 .
공백을 계산하는 awk 스크립트는 다음과 같습니다.
awk 'BEGIN { amount = 0 }
/^[^[:space:]]/ { print 0; exit }
/^$/{ next }
/^[[:space:]]/ { amount = match($0, "[^[:space:]]") - 1 }
END { print amount }'
하지만 임시 파일이 필요합니다. 스크립트는 다음과 같습니다.
generate_some_text | cat > tempfile
amount=$(above_awk_script < tempfile)
sed "s/^[[:space:]]\{$amount\}//" < tempfile
rm tempfile
질문:
작업에 더 적합한 도구가 있습니까? 임시 파일을 삭제하도록 스크립트를 수정할 수 있나요?
현실:
text/html
요청을 만족시키기 위해 mailcap 항목을 개선하려고 노력 중입니다 copiousoutput
. 지금은 그게 다입니다 text/html; elinks -no-home -dump %s; nametemplate=%s.html; copiousoutput;
. 하지만 짐작하셨겠지만 초기 공백 중 일부를 제거하고 싶습니다. 어쩌면 제가 일을 너무 복잡하게 만든 것 같은데 아주 간단한 해결책이 있을까요?
답변1
모두 공백이거나 모든 탭이므로 다음으로 파이프할 수 있습니다.
sed 'H;$!d;g;: m;/\n[^\n[:blank:]]/!s/\n[^\n]/\n/g;t m;s/.//'
그것은 그렇습니다 (그리고 다른 누구도 그것을 지지 gnu sed
하지 않는다고 생각합니다 ). 이전 버퍼에 각 줄을 추가한 다음 마지막 줄이 아닌 경우 삭제( )하는 방식으로 작동합니다 . 마지막 줄에서는 예약된 공간의 내용을 패턴 공간을 통해 복사합니다 (이제 패턴 공간의 내용은 ewline으로 시작합니다). 패턴 공간에 공백이 아닌 문자( )로 시작하는 줄이 없으면 각 줄의 첫 번째 문자( )가 제거됩니다. 교체가 성공할 때마다 레이블로 다시 분기됩니다. 패턴 공간에서 최소한 한 줄이 공백이 아닌 문자로 시작하면 패턴 공간( )에서 선행 개행 문자를 제거한 다음 자동으로 인쇄합니다.sed
[\n]
H
d
$!
g
\n
s/\n[^\n]/\n/g
/\n[^\n[:blank:]]/!
m
s/.//
답변2
출력의 첫 번째 줄에만 관심이 있다면 줄 1만 지정하여 sed가 보는 내용을 제한하세요.
printf ' some text\n\n some more text\n' |sed '1s/^[ \t]*\([^ \t]\+.*\)$/\1/'
이는 선행 공백을 무시한 다음 공백이 아닌 줄과 줄의 나머지 부분과 일치하며 줄 1에서만 일치합니다.