awk, 특수 문자가 포함된 큰 문자열을 제거하는 방법은 무엇입니까?

awk, 특수 문자가 포함된 큰 문자열을 제거하는 방법은 무엇입니까?

특수 문자가 많이 포함된 큰 문자열을 삭제하고 싶습니다. 특수 문자를 사용하거나 인용 할 수도 sed없습니다 .''""

그래서 나는 노력했다awk

gawk '{gsub("[VERYLGONGSTIRNGKKXquQX4wbbEKW8gUilRyw/withalotofspecialchars/ABUJBJHHF848488484.....end]", "");print}' file.txt

문제는 문자열을 제거하지만 -.

내 목표는 파일의 나머지 부분을 유지하는 것입니다.

file.txt
string1
string2
VERYLGONGSTIRNGKKXquQX4wbbEKW8gUilRyw/withalotofspecialchars/ABUJBJHHF848488484.....end
OTHERLONGSTRINGWHICHIWANTTOPRESERVE...
string4 

이 되다..

string1
string2
OTHERLONGSTRINGWHICHIWANTTOPRESERVE...
string4 

어떻게 해야 하나요?

답변1

껍데기여기에 문서 인용참조 처리/지옥 탈출을 위한 편리한 메커니즘입니다.

string_with_quotes=$(cat << 'END'
long string with 'single quotes' and "double quotes" and *[arbitrary $special !characters.
END
)

awk의 -v옵션은 쉘 변수를 awk 변수로 전달합니다. 정규식 일치 대신 문자열 동등성을 사용하십시오.

awk -v target="$string_with_quotes" '$0 != target' file

Ed가 언급했듯이 [다른 기술]-v 에 문제가 있을 수 있습니다 .

special='foo\tbar\rqux'
awk -v target="$special" 'BEGIN {print target}'
qux   bar

환경을 통해 문자열 전달

special='foo\tbar\rqux'
export special
awk 'BEGIN {print ENVIRON["string_with_quotes"]}'
foo\tbar\rqux

그리고, 귀하의 질문에 관해서

export special=3
seq 5 | awk '$0 != ENVIRON["special"]'
1
2
4
5

[기타 기술] : 문제는 awk가 이스케이프 시퀀스를 해석하기를 원하는지 여부이기 때문입니다(이 2 문자를 \tawk에서 (i) 2문자 문자열 또는 (ii) 단일 탭 문자로 처리해야 하는지). 표시된 것처럼 환경 강제 awk를 사용하여 데이터를 전달합니다.아니요이스케이프 시퀀스를 해석합니다. bash 기술을 사용하여 동일한 작업을 수행할 수도 있지만 이렇게 우아하지는 않습니다.

# not exported
special='foo\tbar\rqux'

awk -v target="${special//\\/\\\\}" 'BEGIN {print target}'
# or
awk -v target="$(printf '%q' "$special")" 'BEGIN {print target}'

관련 정보