Linux 删除带有特殊字符和图案的线条

Linux 删除带有特殊字符和图案的线条,linux,shell,unix,awk,Linux,Shell,Unix,Awk,我正在尝试删除一行带有特殊字符的行,该行没有前缀\。 以下是特殊字符: ^$%.*+?!(){}[]|\ 我需要检查以上所有特殊字符,这些字符在第2列中没有前缀\。 我正在尝试使用awk来完成此操作,但运气不佳。我希望输出如下 input.txt 1,ap^ple 2,o$range 3,bu+tter 4,gr(ape 5,sm\(oke 6,ra\in 7,pla\\y 8,wor\+k output.txt 1,ap^ple 2,o$range 3,bu+tter 4,gr(ape 6

我正在尝试删除一行带有特殊字符的行,该行没有前缀
\
。 以下是特殊字符:

^$%.*+?!(){}[]|\
我需要检查以上所有特殊字符,这些字符在第2列中没有前缀
\
。 我正在尝试使用
awk
来完成此操作,但运气不佳。我希望输出如下

input.txt

1,ap^ple
2,o$range
3,bu+tter
4,gr(ape
5,sm\(oke
6,ra\in
7,pla\\y
8,wor\+k
output.txt

1,ap^ple
2,o$range
3,bu+tter
4,gr(ape
6,ra\in

我相信您只是在寻找:

  awk '$2 !~ /\\[][|\\{}()!?+*.%$^]/' FS=,
这将在给定的输入文件上提供所需的输出,但与问题中给出的描述完全不匹配

编辑

根据注释部分的讨论,所需的解决方案似乎应该输出包含特殊字符的所有行,除非该字符前面有反斜杠。鉴于这种描述,我们必须从特殊字符列表中删除反斜杠。一种(非工作的,用于描述)解决方案是:

awk '$2 ~ /[^\\][][|{}()!?+*.%$^]/' FS=,
这只是匹配任意两个字符串,其中第一个不是反斜杠,第二个是字符
][|{}()!?+*.%$^
。此操作失败,因为它无法捕获特殊字符作为字符串的第一个元素出现的情况。为此,我们扩展了正则表达式,以便第一个字符可以是字符串的开头,也可以是非反斜杠的任何字符

awk '$2 ~ /(^|[^\\])[][|{}()!?+*.%$^]/' FS=,

我们需要对特殊字符重新排序的原因是,
]
在括号内有一个特殊的含义(即,它关闭了括号!),必须先列出才能避免该含义。类似地,
^
不能是第一个,因为当它是字符类的第一个成员时,它有一个特殊的含义(它否定该类)。(其他字符不重要;它们只是因为排版错误而被重新排序。)

技巧的一部分是将特殊字符安全地放入字符类,记住
]
^
-
(不在列表中)在字符类中具有与它们相关联的特殊规则。具体地说,作为第一个字符的
^
将否定字符类(因此将其放置在第一个字符以外的其他位置),并且
]
字符终止字符类,除非它是
^
后面的第一个或第二个字符

因此,您需要:

awk '/\\[]^$%.*+?!(){}[\\|]/ { next } { print }' input.txt
复杂(可怕的)正则表达式匹配一个反斜杠,后跟一个特殊字符;操作是
next
跳过该行。
{print}
(也可以写入
1
或任何其他真值)打印正则表达式未消除的行

示例输出

1,ap^ple
2,o$range
3,bu+tter
4,gr(ape
6,ra\in
您可以优化处理以忽略第一个字段,以此类推,这与我对列表中字符的重新排序方式基本相同,但不解释原因

awk -F, '$2 !~ /\\[]^$%.*+?!(){}[\\|]/ { print }' input.txt

您的示例输出与您对问题的描述不匹配。似乎您正试图删除包含一个特殊字符(前面有反斜杠)的所有行;“这没有什么特别的意义,”乔纳森说。有趣的是,我的awk没有在这方面生成警告。看来
gawk
对这个特别的警告非常慷慨!谢谢@William,但是如果输入文件中包含类似
7,p+la\\y
@Ganz的行,它不会给出精确的输出。您希望该行被输出还是不输出?您的描述与您给出的示例不匹配,因此很难知道您想要什么。抱歉@William当第2列有2个特殊字符时,awk命令失败。我希望在output.txt
7,p+la\\y
4,g)r中也有这些行(ap\+e。谢谢@Jonathan,但如果输入文件包含类似
7,p+la\\y
的行,那么当一个特殊字符没有反斜杠,另一个字符有反斜杠时,您需要的输出是什么?您的测试数据和描述不包括这种情况。对不起@Jonathan当第二个字符出现时,awk命令失败列有两个特殊字符(一个带反斜杠,另一个不带反斜杠)。我希望这些行也出现在output.txt
7,p+la\\y
4,g)r(ap\+e)中。因为列中还有一个不带反斜杠的特殊字符。很抱歉,我没有在描述中包含这一行。