다음 내용의 데이터 파일이 있습니다.
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
솔루션은 최신 버전에 grep
PCRE(Perl Regular Expression Support)가 포함되어 있다고 가정합니다.
이러한 솔루션과 다른 솔루션의 주요 차이점은 솔루션이 입력 데이터에 대해 더 엄격한 구조(특정 문자 위치)를 가정하는 cut
패턴을 기반으로 일치한다는 것입니다 .cut
정적 위치 매칭
사용의 또 다른 대안은 s 함수를 cut
사용하는 것입니다 .awk
substr
$ cat dept.dat | while read line
do
echo "$line"
echo "$line" | awk '{print substr($0,13,16)}'
done