awk (GNU Awk 4.2.0) input 에서 {
with \{
, [
with \[
및 |
with 와 같은 일부 문자를 이스케이프 처리해야 합니다 \|
. 나는 세 가지 호출을 통해 gsub
이를 달성했습니다 .
for (i = 2; i <= NF; i++) {
gsub(/{/, "\\{", $i)
gsub(/\[/, "\\[", $i)
gsub(/\|/, "\\|", $i)
}
이 세 가지 호출을 하나로 결합하려면 어떻게 해야 합니까? 그것은 마치
gsub(/([{[|])/, "\\\1", $i)
답변1
너&
일치하는 텍스트를 참조하기 위해 대체에 사용할 수 있습니다.:
$ awk '{gsub(/[[{|]/, "\\\\&", $0); print}' <<<"abc { | [ def"
abc \{ \| \[ def
이는 [...]
패턴에 [
, 및 를 포함하는 일반 문자 클래스 |
이며 완전히 이스케이프된 백슬래시와 교체가 뒤따릅니다. 당신은 정말로 그들 모두가 필요합니다.{
&
더 복잡한 패턴의 경우gawk에는 gensub
기능이 있습니다예를 들어 텍스트의 일부를 인용할 수 있지만 \\1
여기서는 필요하지 않습니다. 모든 POSIX 규정은 대체 항목에 일치하는 전체 하위 문자열을 포함하는 동작을 awk
지원합니다 .&
답변2
OP는 아마도 $1
이를 방지하고 싶어할 것입니다.
echo;
(
mawk '{ gsub(/[[{|]/, "\\\\&", $0); print}' <<<"a[b{c { | [ def";
mawk '$(((__=$!_)gsub("[[{|]","\\\\&"))~_)=__' <<<"a[b{c { | [ def" \
) | gcat -n | lgp3
1 a\[b\{c \{ \| \[ def
2 a[b{c \{ \| \[ def
따라서 모든 것을 반복하는 대신 $2 to $NF
원본의 복사본을 저장하고 전체 행을 $1
처리 gsub()
한 다음 다시 넣습니다.
원본을 첫 번째 필드에 다시 넣는 것의 추가 이점은 $1
마치 이미 완료된 것처럼 $1=$1
대체 항목에 관계없이 해당 줄이 인쇄되도록 보장한다는 것입니다.