가장 좋은 접근 방식이 무엇인지 알고 싶습니다.grep또는확인하다)는 다음을 포함하는 행을 반환합니다.불균형 특수 문자 집합문자열로? 예를 들어, 문자열이 다음과 같은 경우:
bqM#+t1U"OyBGhk]ozVG[v"&
그리고 지정된 문자가 큰따옴표(")인 경우 이 줄은 반환되지 않습니다. 그러나 내가 찾고 있는 것은 더 복잡하고 왼쪽 대괄호([) 및 오른쪽 사각형과 같은 왼쪽과 오른쪽 균형이 필요합니다. 대괄호(]) if ([) 개수가 (]) 개수와 같지 않으면 행이 반환됩니다. 예:
i],U2y.2<i*gZCl>y[A~a`^[
답변1
grep
Perl과 유사한 정규식 구현을 지원 함으로써 재귀 정규식 기능을 사용하여 일치 / 쌍이 -P
있는 줄을 찾고 반전할 수 있습니다.[
]
-v
grep -Pxv '((\[(?1)\]|[^][])*+)'
요구 사항 [
은이미 팔로우 중해당 ]
즉 [foo]
, 균형 잡힌 것으로 간주되지만 그렇지 않습니다.]foo[
또는 순서가 중요하지 않은 경우:
grep -Pxv '((\[(?1)\]|\](?1)\[|[^][])*+)'
[foo]
다시 ]foo[
균형을 잡았 지만 [foo
여전히 작동하지 않습니다.
이는 실제로 s개와 다른 [
s개의 행을 반환합니다. ]
이를 달성하는 더 쉬운 방법은 개수를 세는 것입니다.
perl -lne '$l = () = /\[/g; $r = () = /\]/g; print if $l != $r'
awk 'gsub(/\[/, "&") != gsub(/\]/, "&")'
를 사용하면 루프에서 쌍을 제거하고 s 또는 s가 남아 sed
있는지 여부를 인쇄할 수 있습니다 .[
]
sed -e 'h;:1' -e 's/\[\(.*\)\]/\1/g;s/\]\(.*\)\[/\1/g;t1' -e '/[][]/!d;g'
또는 순서가 중요한 경우:
sed -e 'h;:1' -e 's/\[\([^][]*\)\]/\1/g;t1' -e '/[][]/!d;g'