안쪽 작은따옴표를 반전된 물음표(¿)로 바꾸고 싶습니다(바깥쪽 작은따옴표 무시). 아래 명령을 사용하고 있지만 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
.
코드에는 세 가지 주요 문제가 있습니다.
셸에서 작은따옴표로 묶인 문자열에는 작은따옴표가 포함될 수 없습니다. 호출에 포함된 작은따옴표는
gsub()
코드인 작은따옴표로 묶인 문자열을 끝내고awk
구문 오류를 생성합니다.입력 필드 구분 기호를 작은따옴표로 설정하면 입력이 모든 작은따옴표로 분할
-F "'"
됩니다 .awk
즉,awk
프로그램이안 돼요작은 따옴표가 표시되므로gsub()
아무것도 바꿀 수 없습니다.문자열은
\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'