Unix: 파일에서 한 줄의 원시 내용을 읽는 방법

Unix: 파일에서 한 줄의 원시 내용을 읽는 방법

다음 내용의 데이터 파일이 있습니다.

department: customer service  section: A
department: marketing         section: A
department: finance           section: A

각 줄을 읽으면서 명령을 사용하여 부서 이름을 추출합니다 cut. 아쉽게도 프로그램이 trim불필요한 공간을 모두 자동으로 제거하므로 실수로 부서 이름을 잘랐습니다.

cat dept.dat | while read line
do
    echo $line
    echo $line | cut -c 12-29
done

예를 들어 원래 줄은 다음과 같습니다.

department: marketing         section: A

프로그램은 이 줄을 다음과 같이 처리합니다.

department: marketing section: A

불필요한 공간을 모두 잘라내지 않고 어떻게 줄을 읽을 수 있나요?

답변1

확장하면 공간이 손실됩니다 $line. 변수 확장 주위에 큰따옴표를 넣으면 공백이 유지됩니다.

$ cat dept.dat | while read line
> do
>     echo "$line"
>     echo "$line" | cut -c 12-29"
> done
department: customer service  section: A
 customer service 
department: marketing         section: A
 marketing        
department: finance           section: A
 finance          

답변2

정규식 일치

다음을 사용하여 비슷한 효과를 얻을 수도 있습니다 sed.

$ cat dept.dat | while read line
do
  echo "$line"
  echo "$line" | sed -e 's/.*: \(.*\)  .*/\1/'
done

다음을 사용할 수도 있습니다 awk.

$ cat dept.dat | while read line
do
  echo "$line"
  echo "$line" | awk '{sub(/.*nt: /,""); sub(/  .*/,""); print }'
done

다음을 사용할 수도 있습니다 grep.

$ cat dept.dat | while read line
do
  echo "$line"
  echo "$line" | grep -oP '(?<=: ).*(?=  )'
done

노트:grep솔루션은 최신 버전에 grepPCRE(Perl Regular Expression Support)가 포함되어 있다고 가정합니다.

이러한 솔루션과 다른 솔루션의 주요 차이점은 솔루션이 입력 데이터에 대해 더 엄격한 구조(특정 문자 위치)를 가정하는 cut패턴을 기반으로 일치한다는 것입니다 .cut

정적 위치 매칭

사용의 또 다른 대안은 s 함수를 cut사용하는 것입니다 .awksubstr

$ cat dept.dat | while read line
do
  echo "$line"
  echo "$line" | awk '{print substr($0,13,16)}'
done

관련 정보