Вам понадобится -P
для PCRE, который реализует Perl (?!...)
отрицательный просмотр вперед, и чтобы не экранировать !
в (?!...)
.
-bash-4.2$ cat input
<?php
<?xml
<?=
<?okay
<?
-bash-4.2$ grep -P '<\?(?!php|xml|=)' input
<?okay
<?
-bash-4.2$
"<\?(?\!php|=|xml)"
неверно, поскольку это переходит от (?\!...)
к grep
, а ?\!
совершенно не соответствует ?!
с точки зрения механизма регулярных выражений; если вы не уверены, что передается программе оболочкой, либо напишите код для проверки этого:
$ perl -E 'printf "%*vd\n","\t",$ARGV[0];say join "\t",split //,$ARGV[0]' "?\!"
63 92 33
? \ !
$
Или используйте что-то вроде strace
, чтобы увидеть, что grep
получил:
-bash-4.2$ strace -o grep grep "?\!grep" /etc/passwd
-bash-4.2$ grep grep grep
execve("/usr/bin/grep", ["grep", "?\\!grep", "/etc/passwd"], [/* 24 vars */]) = 0
-bash-4.2$
с помощью xsv(https://github.com/BurntSushi/xsv)начиная с
A,B,C,D
a,b,c,d
e,f,g,h
e,i,j,k
a,m,n,k
и работает
xsv stats input.csv --everything | xsv select field,cardinality >output.txt
у вас будет
field,cardinality
A,2
B,4
C,4
D,3