쉘 스크립트에서 외국어를 grep할 수 없습니다.

쉘 스크립트에서 외국어를 grep할 수 없습니다.

저는 쉘 스크립팅을 처음 접했고 다음 형식의 텍스트가 포함된 텍스트를 가지고 있습니다.

"some foreign language",'corresponding ID to text'

예를 들어:-

"Назад",IDC_SSB_DLG_BACK_BTN

ID와 관련된 텍스트를 찾아서 텍스트 파일로 저장해야 합니다.

내 샘플 스크립트는 다음과 같습니다.

#!/bin/sh
target_file=$1
output=$2
translationID=IDC_SSB_DLG_BACK_BTN
translation=$(cat $target_file | grep $translationID)
translationValue=$(echo "$translation" | awk -F',' '{print $1}')
translationValueFinal=$(echo "$translationValue" | tr -d '"')
echo "$translationValueFinal" >> $output

이 스크립트를 실행할 때 오류가 발생했습니다.-grep: (standard input): binary file matches

쉘 스크립트에서 외국어를 grep하고 저장하는 방법을 제안해주세요. 감사해요

답변1

GNU grep을 사용하는 경우 grep에 어떤 문자가 나타나든 입력을 텍스트로 처리하도록 지시할 수 있습니다.

grep -a

하지만 입력에 텍스트가 아닌 바이트가 일부 있는 것 같으므로 입력 파일을 확인하는 것이 좋습니다.

답변2

grep특정 필드에서 리터럴 문자열 일치를 수행하려고 하기 때문에 이를 위해 많은 추가 코드를 사용 하지 마십시오 . grep은 그 자체로 이를 수행할 수 없으며 이를 수행할 수 있는 도구는 다른 도구의 도움이 필요하지 않습니다. .

기존 명령:

translationID=IDC_SSB_DLG_BACK_BTN
grep $translationID

추가해도누락 "grep "$translationID"다음 조건 중 하나라도 해당되면 실패합니다.

  1. 첫 번째 필드의 문자열은 ID와 일치합니다(예 IDC_SSB_DLG_BACK_BTN,any: 또는
  2. 각 필드의 문자열에는 ID가 해당 문자열의 하위 문자열(예: any,FOOIDC_SSB_DLG_BACK_BTNBAR또는 ) 인 고유한 문자열이 포함되어 있습니다 FOOIDC_SSB_DLG_BACK_BTNBAR,any.
  3. any,foo.bar및 와 any,foodbar일치 하는 정규식 메타 문자를 포함하는 두 번째 필드의 문자열 및 ID 변수입니다 translationID=foo.bar.

다른 사람들도 있을 수 있습니다. 바라보다패턴과 일치하는 텍스트를 찾는 방법이러한 유형의 질문에 대한 추가 정보.

예를 들어 다음 입력 파일을 사용하십시오.

$ cat file
any1,foodbar
foo.bar,any2
foofoo.barbar,any3
any4,foofoo.barbar
"Назад",foo.bar

두 번째 필드가 문자열 foo.bar(즉, 위의 마지막 줄)인 경우 첫 번째 필드의 값을 인쇄하려고 합니다.

$ translationID=foo.bar

grep다음은 예상되는 줄을 찾았지만 잘못된 일치 항목도 많이 만들어 원치 않는 줄을 출력하는 명령 입니다 .

$ grep "$translationID" file
any1,foodbar
foo.bar,any2
foofoo.barbar,any3
any4,foofoo.barbar
"Назад",foo.bar

awk명령을 사용하면 올바른 행만 일치하고 필수 필드만 출력됩니다.

$ awk -F',' -v id="$translationID" '$2==id{print $1}' file
"Назад"

또는 따옴표를 제거하려는 경우 다음을 포함한 다양한 옵션이 있습니다.

$ awk -F'[,"]+' -v id="$translationID" '$3==id{print $2}' file
Назад

awk 명령은 대상 필드의 전체 필드 리터럴*문자열 비교를 수행하므로 정확하지만, grep 명령은 부분 행 정규식 비교를 수행하며, 입력 값이 운이 좋지 않으면 때때로 실패합니다.

*사소한 경고 - translationID문자 그대로 처리하려는 백슬래시를 포함하는 경우 다음을 수행해야 합니다.

$ id="$translationID" awk -F',' '$2==ENVIRON["id"]{print $1}' file
"Назад"

또는 유사한 대안을 참조하세요.awk 스크립트에서 쉘 변수를 사용하는 방법.

입력 파일에 NUL 문자가 포함될 수 있는 경우 GNU awk 또는 다른 awk를 사용하여 지원하는 내용을 문서화하십시오. awk는 텍스트 처리 도구이므로 텍스트 파일만 입력으로 사용해야 하며 POSIX 정의에 따르면 텍스트 파일에는 NUL 문자를 포함할 수 없습니다. UL 문자 및 GNU awk를 사용하여 설정해야 할 수도 있습니다.게스트 모드,예를 들어:

awk -v BINMODE=3 -F',' -v id="$translationID" '$2==id{print $1}' file

관련 정보