!
예를 들어 필드 구분 기호 로 사용하면 awk -F!
오류 메시지가 표시됩니다 bash: !: event not found
. 왜? 받아들이고 있습니다 awk -F"\!"
. 배쉬 버전 3.2.25
답변1
!
Bash의 트리거 문자입니다.역사적 확장. 이 기능이 활성화되면 !foo
명령줄에서 이와 같은 내용이 로 확장됩니다 foo
. 또는 해당 명령줄이 없으면 쉘은 아래와 같이 오류를 표시합니다.
하지만 단어의 마지막 문자로는 아무 것도 해서는 안 됩니다. 이것은 실제로 내가 시도한 모든 Bash 버전에서 예상한 대로 작동합니다.
$ echo 'aa!bb' | awk -F! '{print $1}'
aa
최신 버전에서는 !
닫는 큰따옴표 앞에 아무 작업도 수행하면 안 되므로 -F"!"
이후 버전에서는 작동하지만 3.2에서는 작동하지 않습니다.
백슬래시나 작은따옴표를 사용하여 이스케이프할 수 있습니다. 즉, 확장 \!foo
하거나 '!foo'
확장할 수 없습니다. 물론 set +H
.
큰따옴표를 추가하면 더욱 이상해집니다. 여기서 백슬래시는 기록 확장을 비활성화하지만 백슬래시 자체는 그대로 유지됩니다.
$ printf '%s\n' "\!foo"
\!foo
이 경우 awk -F"\!"
awk 자체가 백슬래시를 제거하기 때문에 작동합니다.
답변2
awk
그 일을 하는 사람 이 아닙니다 . 이것이 껍질입니다. !
셸의 특수 문자입니다.
무엇을 해야할지
항상 당신의 주장을 인용하세요. 예를 들어
awk -F'!'