최근에 명령 줄에서 일부 정규 표현식에 문제가 있었고 백 슬래시를 일치시키기 위해 다른 수의 문자를 사용할 수 있음을 발견했습니다. 이 숫자는 정규식에 사용 된 따옴표 (없음, 작은 따옴표, 큰 따옴표)에 따라 다릅니다. 의미하는 바는 다음 bash 세션을 참조하십시오.
echo "#ab\\cd" > file
grep -E ab\cd file
grep -E ab\\cd file
grep -E ab\\\cd file
grep -E ab\\\\cd file
#ab\cd
grep -E ab\\\\\cd file
#ab\cd
grep -E ab\\\\\\cd file
#ab\cd
grep -E ab\\\\\\\cd file
#ab\cd
grep -E ab\\\\\\\\cd file
grep -E "ab\cd" file
grep -E "ab\\cd" file
grep -E "ab\\\cd" file
#ab\cd
grep -E "ab\\\\cd" file
#ab\cd
grep -E "ab\\\\\cd" file
#ab\cd
grep -E "ab\\\\\\cd" file
#ab\cd
grep -E "ab\\\\\\\cd" file
grep -E 'ab\cd' file
grep -E 'ab\\cd' file
#ab\cd
grep -E 'ab\\\cd' file
#ab\cd
grep -E 'ab\\\\cd' file
이것은 다음을 의미합니다.
- 따옴표없이 4-7 실제 백 슬래시와 백 슬래시를 일치시킬 수 있습니다
- 큰 따옴표로 백 슬래시를 3-6 실제 백 슬래시와 일치시킬 수 있습니다
- 작은 따옴표를 사용하면 백 슬래시를 2-3 실제 백 슬래시와 일치시킬 수 있습니다
쉘에서 bash 맨 페이지의 추가 백 슬래시가 무시된다는 것을 이해합니다.
"인용되지 않은 백 슬래시 (\)는 이스케이프 문자입니다. 다음에 오는 다음 문자의 리터럴 값을 유지합니다."
작은 따옴표로 이스케이프 처리되지 않으므로 작은 따옴표로 묶인 예제에는 적용되지 않습니다.
그리고 grep 명령에 의해 하나의 추가 백 슬래시는 무시됩니다 ( "\ c"는 "c"이스케이프되지만 "c"는 정규식에서 특별한 의미를 갖지 않기 때문에 "c"와 동일합니다)).
이것은 작은 따옴표로 예제의 동작을 설명하지만 다른 두 예제, 특히 qouted가 아닌 큰 따옴표로 묶인 문자열 사이에 차이점이있는 이유를 이해하지 못합니다.
bash 매뉴얼 페이지에서 인용 한 내용은
"큰 따옴표로 문자를 묶으면 $,`, \ 및 히스토리 확장이 활성화 된 경우를 제외하고 따옴표 안에있는 모든 문자의 리터럴 값이 유지됩니다!"
GNU awk (예 :)로 awk /ab\cd/{print} file
동일한 결과를 얻었습니다.
그러나 Perl은 다른 결과를 보여줍니다 (예 :) perl -ne
"/ab\\cd/"\&\&print file
.
- 따옴표없이 4-5 실제 백 슬래시와 백 슬래시를 일치시킬 수 있습니다
- 큰 따옴표로 백 슬래시를 3-4 실제 백 슬래시와 일치시킬 수 있습니다
- 작은 따옴표로 백 슬래시를 2 개의 실제 백 슬래시와 일치시킬 수 있습니다
grep과 awk에 대한 명령 줄에서 인용되지 않은 것과 이중 인용 된 정규 표현식 문자열의 차이점을 누구나 설명 할 수 있습니까? 나는 보통 Perl one-liner를 사용하지 않기 때문에 Perl의 행동에 대한 설명에 관심이 없다.
printf "\ntest"
"test"앞에 개행을 삽입합니다. 비록 큰 따옴표로 쉘"\n"
에"n"
의해 변환되어야 하더라도 ... . "\ ntest는", "ntest는"우리는 쓰기에 습관을 얻어야한다 :printf "\\ntest"
나printf '\ntest'
,하지만 어떻게 든 대신 이상한에 의존하는 스크립트를 많이 참조하십시오.