Regex 如何使用vars在awk中排除多个非字母数字字符

Regex 如何使用vars在awk中排除多个非字母数字字符,regex,awk,Regex,Awk,我定义了一系列我不想打印的字符 在此示例中,字符%被正确排除: awk 'BEGIN { FS=";";ch1 = "%";ch2 = "-"} { if(NR > 1) { if($1 !~ ch1) { print $1 } } } END {}' $1 但当我添加第二个变量ch2时,它不会应用任何过滤器: 见下例: awk 'BEGIN { FS=";";ch1 = "%";ch2 = "-"} { if(NR > 1) {

我定义了一系列我不想打印的字符

在此示例中,字符%被正确排除:

awk 'BEGIN { FS=";";ch1 = "%";ch2 = "-"}
{
if(NR > 1)
{
    if($1 !~ ch1)
    {
            print $1
    }
} 
}
END {}' $1
但当我添加第二个变量ch2时,它不会应用任何过滤器:

见下例:

awk 'BEGIN { FS=";";ch1 = "%";ch2 = "-"}
{
if(NR > 1)
{
    if($1 !~ ch1|| $1 !~ ch2 )
    {
            print $1
    }
} 
}
END {}' $1
如果第一列中包含ch1或ch2,我希望排除该记录

我怎样才能做到这一点?
谢谢

您应该使用
&&
而不是
|
,因为您希望
$1
不包含两个字符:

if($1 !~ ch1 && $1 !~ ch2 )
或者,可以使用括号表达式:

if ($1 !~ /[%-]/)
使用and(&&)代替or(| |)


现在,您仅排除包含两个序列的行

假设您有理由为每个字符使用单独的变量:

awk '
BEGIN {
    FS=";"; ch1="%"; ch2="-"; badChars="["ch1 ch2"]"
}
(NR > 1) && ($1 !~ badChars) {
    print $1
} 
' "$1"

如果坏字符破坏了awk代码,那么选择十六进制值。见下文

> hexdump -C <<< "%-"
00000000  25 2d 0a                                          |%-.|
00000003
> awk -F"|" -v ch1="\x25" -v ch2="\x2d" ' $1~ch1 { print "yes %" } $2~ch2 { print "yes -"} ' <<< "abc%|def-|ghi"
yes %
yes -
>

>hextump-C我已经尝试过了&&但是秒数不计算值,只有第一个变量被过滤掉了