다음 형식의 파일이 있습니다.
title1
line
line
title2
line
line
line
title3
line
line
title2
아래 부분을 추출 하여 들여쓰기를 제거하고 싶습니다 . 나는 현재 사용하고 있습니다 sed
(그러나 OR 쉘 스크립트는 내 상황에 적합하지만 슬프게도 OR 와 awk
같은 언어는 아닙니다 ):perl
python
sed -n -e '/^title2$/,/^[a-zA-Z]/ { /^[a-zA-Z]/ d ; s/^[ \t]*// ; p }'
그러나 이렇게 하면 끝에 논리적으로 빈 줄이 남습니다(논리적으로 공백이나 탭이 있을 수 있기 때문에). 나는 그것을 제거하고 싶다. 섹션에는 보존해야 하는(또는 /^[ \t]*$/ d
해당 작업을 수행하는) 다른 논리적으로 빈 줄이 있을 수 있습니다. 그러므로 나는 이 결과를 원한다:
line
line
line
한 번 더 할 수도 sed -e '$d'
있는데, 두 번째 과정은 피할 수 있는지 궁금합니다.
답변1
나는 예약된 공간을 사용했고 결국
sed -ne '/^title2$/,/^[a-zA-Z]/ { /^title2$/ { n; h; b; } ; /^[a-zA-Z]/ d; H; x; s/[ \t]*//; P; s/.*\n//; x }'
이것은 내가 관심 있는 사건을 올바르게 처리하는 것 같습니다.
답변2
- "일반" 줄(탭이나 흰색 없음)인 경우 해당 줄도 삭제하세요.
/^$/
"논리적" 공백 사용의 경우
/^\s*$/
sed -n -e '/^title2:/,/^[a-zA-Z]/ { /^[a-zA-Z]/ d ; /^$/ d ; s/^[ \t]*// ; p }'
어디
/^$/
매치 스타트 라인, 엔드 라인/^\s*$/
시작 줄, 0개 이상의 공백 또는 탭, 줄 끝과 일치합니다.
답변3
sed -n '/title2/,/^\S/ { //b; /^\s*$/ { N; /\n\S/q; P; D }; s/^\s*//; p }'
나는 원래 @Archemar의 관심을 끌기 위해 이렇게 했습니다. 해주시면 정말 감사하겠습니다제발회신하다이 게시물에 대한 내 댓글시간이 있는 한. 대답이 "모른다"라고 하더라도. 감사해요.
적어도 내 bash 쉘에서는 필요하지 않습니다 -e
. 왜 필요한지 궁금하십니까? 그리고 만약에\s
또는\S
[ \t]
지원되지 않습니다. 각각 ' 및 [^ \t]
' 로 바꿀 수 있습니다 .
이 질문을 처음 봤을 때처럼 아무것도 모르는 사람을 위해:
-n
자동 인쇄 끄기/title2/,/^\S/
검색 범위sed
(문자열이 처음 "title2
"으로 나타나는 줄부터 공백이 아닌 문자 [ietitle3
] 로 시작하는 다음 줄까지)입니다.포함한){
방금 지정한 범위나 패턴에 수반되는 명령을 적용한다는 의미입니다.//b
다음 명령은 범위의 시작과 끝 부분에 적용되지 않을 수 있습니다.
보다 정확하게는 스크립트 끝( )과 일치하거나 분기하면title2
( 남은 줄이 있으면 파일의 다음 줄을 처리합니다)^\S
b
암소 비슷한 일종의 영양sed
(BSD유사한 설명, 다른 버전이 있는지 확실하지 않음sed
)'//' 마지막 정규식 일치를 반복합니다.
/^\s*$/
범위 내에서 "논리적으로 비어 있는" 행과 일치합니다.{
N; /\n\S/q;
따라서 "논리적으로 공백" 라인이면N
다음 라인이 패턴 공간에 추가되고, 다음 라인이 다음 헤더이면 처리가 완전히 종료되므로(q
) "논리적으로 공백" 라인도 다음 헤더도 아닙니다. 인쇄됩니다.P; D
"논리적으로 비어 있는" 줄인 경우아니요다음은 다음 제목이고 그 다음은오직"논리적으로 빈" 줄(P
)을 인쇄한 다음오직패턴 공간에서 "논리적으로 빈" 줄을 제거하고N
스크립트 시작 부분부터 처리할 패턴 공간에 다음 줄을 추가한 채로 둡니다(D
).
}
s/^\s*//; p
줄 시작 부분에서 공백과 탭을 제거하고 서식이 지정된 줄을 인쇄합니다.
}
@Archemar 부탁드려요돕다