다양한 변수에 대해 가능한 값 범위가 포함된 텍스트 파일이 있습니다.
1. life: short,long,na.
2. weather_f: cloudy,rainy,sunny,foggy,cold,warm,mild,
humid,na.
3. sea_temp: warm,mild,cold,na.
아래와 같은 출력 파일을 얻고 싶습니다.
short,long,na
cloudy,rainy,sunny,foggy,cold,warm,mild,humid,na
warm,mild,cold,na
나는 이것을 사용해 보았 sed
으나 새로운 라인 weather_f
때문에 어려움을 겪었습니다. 예상되는 결과를 어떻게 얻을 수 있나요?
답변1
줄이 쉼표로 끝나면 즉시 다음 줄을 버퍼에 추가합니다. 이는 sed
표현식을 사용하여 수행됩니다.
/,$/N
이 N
명령은 개행 문자를 둘 사이의 구분 기호로 사용하여 버퍼의 텍스트에 다음 줄을 추가합니다.
이러한 연속된 여러 줄을 허용하려면 루프의 시작 부분으로 돌아가서 버퍼 끝에 쉼표가 있는지 확인하세요.
:again
/,$/ {
N
# branch to the "again" label at the top
b again
}
그 후에는 더 이상 버퍼에 라인을 추가할 필요가 없으므로 라인을 자르고 원하는 대로 배열할 수 있습니다. 여기에는 첫 번째 문자 앞의 모든 항목 제거 :
, 공백과 유사한 모든 문자(삽입된 줄 바꿈 포함 N
) 제거, 후행 점 제거가 포함됩니다.
s/[^:]*://
s/[[:space:]]//g
s/\.$//
전체 편집 스크립트는 다음과 같습니다.
:again
/,$/ {
N
b again
}
s/[^:]*://
s/[[:space:]]//g
s/\.$//
이는 파일(여기)의 스크립트를 사용하여 script
수행할 수 있습니다 .
sed -f script file
또는 명령줄에 스크립트를 입력하려면
sed -e :again \
-e '/,$/ { N; b again; }' \
-e 's/[^:]*://' \
-e 's/[[:space:]]//g' \
-e 's/\.$//' file
귀하의 질문에 데이터가 주어지면 다음이 출력됩니다.
short,long,na
cloudy,rainy,sunny,foggy,cold,warm,mild,humid,na
warm,mild,cold,na
일부 구현에는 고유한 표현이 sed
필요할 수 있습니다 .b again
sed -e :again \
-e '/,$/ { N' -e 'b again' -e '}' \
-e 's/[^:]*://' \
-e 's/[[:space:]]//g' \
-e 's/\.$//' file