awk에서 "를 바꾸는 방법은 무엇입니까?

awk에서 "를 바꾸는 방법은 무엇입니까?

예를 들어, a를 in "단어 로 변경해야 합니다.quote

변화

a string with a " at some point

입력하다

a string with a quote at some point

나는 시도했다:

$ echo 'a string with a " at some point' | awk 'sub(",quote)'
awk: cmd. line:1: sub(",quote)
awk: cmd. line:1:     ^ unterminated string
awk: cmd. line:1: sub(",quote)
awk: cmd. line:1:     ^ syntax error
$
$ echo 'a string with a " at some point' | awk 'sub(\",quote)'
awk: cmd. line:1: sub(\",quote)
awk: cmd. line:1:     ^ backslash not last character on line
awk: cmd. line:1: sub(\",quote)
awk: cmd. line:1:     ^ syntax error

하지만

$ echo 'a string with a " at some point' |
  awk 'sub("string","rope")'

=>

a rope with a " at some point

밧줄 단어에 적합합니다.

답변1

echo 'duck " cat' | sed 's/"/quote/'

또는 에서 정규식이므로 awk다음 과 같은 일반적인 형식으로 표시합니다.sub//

echo 'duck " cat' | awk 'sub(/"/,"quote")'

답변2

문자열을 사용하려면 따옴표로 묶어야 합니다. 이는 알파벳 문자로 구성된 문자열(문자열/로프 예에서처럼)과 메타문자 문자열(큰따옴표와 같이)에도 해당됩니다. 즉, sub (","quote")작동하지 않는 이유는 sub (q,"quote")작동하지 않는 이유와 동일합니다.

문자열 종결자 안에 큰따옴표가 있는지 확인해야 합니다. 쉘에서 문자열 종결자로 작은따옴표를 이미 프로그램에 전달하고 있어 awk프로그램에서 이를 사용하기가 더 어려워지기 때문에 이는 약간 더 어려워집니다. 이 문제를 방지하는 방법에는 두 가지가 있습니다.

  1. 프로그램을 awk문자열로 전달하는 대신 파일에 작성한 다음(라고 가정 substitution.awk) 해당 파일을 가리키는 인수를 awk사용하여 실행합니다(예 : ). 이렇게 하면 작은따옴표가 문자열 종결자로 해제되어 프로그램에서 사용할 수 있습니다.-fawk -f substition.awk
  2. awk및 쉘은 모두 백슬래시( \)를 이스케이프 문자로 지원합니다. 이를 사용하면 awk다음 문자를 일반적인 방법으로 해석할 수 없지만 일반 문자로 처리해야 함을 쉘에 알릴 수 있습니다 . 즉, 다음 중 하나를 수행할 수 있습니다.

    awk 'sub(\'"\',"quote")'
    

    아니면 이거:

    awk 'sub("\"","quote")'
    

    첫 번째 예에서는 셸에서 두 개의 작은따옴표를 이스케이프하여 awk두 번째 예에서는 큰따옴표를 이스케이프하여 awk큰따옴표가 있는 문자열을 구성합니다.

답변3

echo 'a string with a " at some point' | awk -v dq=\" '{sub(dq,"quote")}1'

답변4

8진수 이스케이프를 사용할 수 있습니다.

awk 'sub("\42", "quote")' <<'eof'
a string with a " at some point
eof

관련 정보