Unix awk는 내부 작은따옴표를 반전된 물음표로 바꿉니다.

Unix awk는 내부 작은따옴표를 반전된 물음표로 바꿉니다.

안쪽 작은따옴표를 반전된 물음표(¿)로 바꾸고 싶습니다(바깥쪽 작은따옴표 무시). 아래 명령을 사용하고 있지만 awk작동하지 않습니다. 세미콜론은 구분 기호입니다.

awk -F "'" -v OFS="'" '{for  (i=2; i<=NF; i+=2) gsub("'","\302\277", $i } 1' filename

데이터는 다음과 같습니다

'gasg'dhsh';'dhdjs'

답변1

¿파일의 단어 주위에 있는 모든 작은따옴표를 바꾸려면( bash사용할 수 있도록 사용한다고 가정 $'...'):

q=$'\302\277'
sed "s/\>'\</$q/g" file

또는

q=$( printf '\302\277' )
sed "s/\>'\</$q/g" file

또는

sed "s/\>'\</¿/g" file

입력이 주어지면 다음이 생성됩니다.

'gasg¿dhsh';'dhdjs'

이 패턴은 바로 앞과 뒤에 단어 문자가 있는 \>'\<모든 패턴과 일치합니다 . '문자 ;와 줄의 시작/끝은 단어 문자가 아니지만 둘 다 g입니다 d.


코드에는 세 가지 주요 문제가 있습니다.

  1. 셸에서 작은따옴표로 묶인 문자열에는 작은따옴표가 포함될 수 없습니다. 호출에 포함된 작은따옴표는 gsub()코드인 작은따옴표로 묶인 문자열을 끝내고 awk구문 오류를 생성합니다.

  2. 입력 필드 구분 기호를 작은따옴표로 설정하면 입력이 모든 작은따옴표로 분할 -F "'"됩니다 . awk즉, awk프로그램이안 돼요작은 따옴표가 표시되므로 gsub()아무것도 바꿀 수 없습니다.

  3. 문자열은 \302\277이스케이프 시퀀스로 해석되지 않는 한 반전된 물음표가 아닙니다.

이러한 문제를 모두 수정하면 프로그램이 정상적으로 실행되지만 모든 작은따옴표가 대체됩니다.

$ awk -F ';' -v OFS=';' '{ for (i=1; i<=NF; ++i) gsub("'"'"'", sprintf("\302\277"), $i); print }' file
¿gasg¿dhsh¿;¿dhdjs¿

답변2

"내부 작은따옴표"는 "외부 작은따옴표"가 있음을 의미하고 이러한 외부 따옴표가 각 필드의 시작과 끝(이 경우 ";"로 구분됨)에 있다고 가정하면 다음을 사용할 수 있습니다.

$ awk -F ';' '{OFS=FS;for(j=1;j<=NF;j++){gsub(q,i,$j);sub("^"i,q,$j);sub(i"$",q,$j)}}{print}' q='\047' i='¿'
'gasg¿dhsh';'dhdjs'

관련 정보