저는 쉘 스크립팅을 처음 접했고 다음 형식의 텍스트가 포함된 텍스트를 가지고 있습니다.
"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"
다음 조건 중 하나라도 해당되면 실패합니다.
- 첫 번째 필드의 문자열은 ID와 일치합니다(예
IDC_SSB_DLG_BACK_BTN,any
: 또는 - 각 필드의 문자열에는 ID가 해당 문자열의 하위 문자열(예:
any,FOOIDC_SSB_DLG_BACK_BTNBAR
또는 ) 인 고유한 문자열이 포함되어 있습니다FOOIDC_SSB_DLG_BACK_BTNBAR,any
. 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