파일/파이프에서 공통 초기 공백 찾기(및 제거)

파일/파이프에서 공통 초기 공백 찾기(및 제거)

텍스트 스트림이나 파일에서 일반적인 초기 공백을 찾아서 제거하는 방법을 찾고 있습니다. 삭제하고 싶지 않아요모두선행 공백(간단한 공백입니다 sed 's/^[[:space:]]*//'). 모두에게 공통되는 금액만하지만 빈 줄.

예:

printf '  some text\n\n   some more text\n' | the_awesome_command_or_script

인쇄해야 함

some text

 some more text

진전:

awkwhile루프와 같은 도구를 사용하여 먼저 모든 줄을 반복하고 초기 공백을 계산한 다음 동적으로 생성된 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]Hd$!g\n
s/\n[^\n]/\n/g/\n[^\n[:blank:]]/!ms/.//

답변2

출력의 첫 번째 줄에만 관심이 있다면 줄 1만 지정하여 sed가 보는 내용을 제한하세요.

printf ' some text\n\n some more text\n' |sed '1s/^[ \t]*\([^ \t]\+.*\)$/\1/'

이는 선행 공백을 무시한 다음 공백이 아닌 줄과 줄의 나머지 부분과 일치하며 줄 1에서만 일치합니다.

관련 정보