단어의 시작과 끝 부분에 있는 문자를 무시합니다.

단어의 시작과 끝 부분에 있는 문자를 무시합니다.

일부 필드는 무시되고 다른 필드는 확인되도록 스크립트를 통해 특정 이름의 flatdb를 전달하려고 합니다. 현재 이것이 내가 가진 것입니다.

주석과 공백 줄을 무시하려면 then 문에서 무엇을 사용해야 합니까?

편집: 파일을 읽는 예

Bob,Brown,Smith,39
#Alex,Jay,Jones,83

Justin,Michael,White,18
 James,Paul,Weis,54

편집: 그런 다음 각 이름을 분리했습니다.

IFS_SAVE=${IFS}
IFS=,

while read value1 value2 value3 value4
do
 echo "First name ${value1}"
 echo "Middle name ${value2}"
 echo "Last name ${value3}"
 echo "Age ${value4}"
done < ${1}

그런 다음 파일의 빈 줄을 무시하려고했습니다.

while read value1 value2 value3 value4
do
if [ -z ${value1} ]
 then
   echo "blank line exists"
 fi
done < ${1}

그런 다음 파일에서 주석 처리된 줄을 무시하려고 했습니다.

while read value1 value2 value3 value4
do
if [ "${value1:0:1}" = "#" ]
 then
    echo "comment exists"
 fi
done < ${1}

여기서부터는 실제로 작동하지 못했습니다.

필드가 공백으로 시작하거나 끝나는지 확인하려고 합니다.

while read value1 value2 value3 value4
do
if [[ ${value1} = *[[:space:]]* ]]
then
    echo "space exist"
fi
done < ${1}

편집: 이상적인 출력

First name Bob
Middle name Brown
Last name Smith
Age 39
First name Justin
Middle name Michael
Last name White
Age 39
 James,Paul,Wise,54 space exist

답변1

read또는 같은 수백 개의 부적절한 도구를 반복하는 대신 텍스트 처리 도구를 사용하여 텍스트를 처리하십시오.echo.

여기서 표 형식 데이터를 처리하는 확실한 방법은 다음과 같습니다 awk.

awk -F, -v OFS='\n' '
  ! /^[#[:space:]]/ {
    print "First name "  $1, \
          "Middle name " $2, \
          "Last name "   $3, \
          "Age "         $4
  }' < you-file

조건은 또는 ! /^[#[:space:]]/( )로 시작하지 않는 ( ) 행 과 일치합니다 .!^#공백특징. 또는 /^[^#[:space:]]/이외의 문자로 시작하는 줄을 일치시킬 수도 있습니다 .#공백실제로 이는 빈 줄도 건너뛰거나 && NF == 44개의 필드가 포함되지 않은 건너뛰기 줄에 추가됩니다.

또는 예상 출력에서 ​​그대로 선행 또는 후행 공백이 있는 줄을 전달합니다.

awk -F, -v OFS='\n' '
  /^[[:space:]]/ || /[[:space:]]$/ {print; next}

  /^[^#]/ && NF == 4 {
    print "First name "  $1, \
          "Middle name " $2, \
          "Last name "   $3, \
          "Age "         $4
  }' < you-file

(여기서는 POSIX 문자 클래스가 지원되지 않기 때문에 처음에 찾을 것으로 예상되는 하드 코딩된 공백 문자 목록으로 POSIX 호환성 awk을 가정 mawk합니다 .)[:space:]mawk

또한 캐리지 리턴 문자(CR //라고도 함 \r) 는 ^M하나의 문자로 처리됩니다 [:space:]. 입력 파일이 Unix에서와 같이 줄 구분 기호가 LF가 아닌 CRLF인 Microsoft 운영 체제의 텍스트 파일인 경우 각 줄은 다음과 같습니다.공백특징. dos2unixUnix 형식으로 변환하려면 먼저 파일을 실행 해야 합니다 .

답변2

IFS에서 단어 분리가 발생하고 기본 IFS는 'tab/space/newline'으로 구성되며 IFS를 쉼표로 설정해야 하므로 다음이 ,필요합니다.

while IFS=, read -r  …

또한 ${value1} = *[[:space:]]*다음과 같이 변경되었습니다."${value1}" =~ ^[[:space:]]패턴 매칭저것공백으로 시작하기와 진짜 없다단어이것이 IFS가 분할되는 방식임을 의미합니다(여기서는 쉼표).

당신은 또한 볼 수 있습니다쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?

관련 정보