gpt4 book ai didi

linux - 删除具有给定模式的特殊字符的行

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:37 24 4
gpt4 key购买 nike

我试图获取带有特殊字符的行,这些字符没有以 \ 为前缀。以下是特殊字符:

^$%.*+?!(){}[]|\

我需要在第 2 列中检查以上所有不以 \ 为前缀的特殊字符。我正在尝试用 awk 来完成这个,但没有运气。我想要如下输出。

输入.txt

1,ap^ple
2,o$range
3,bu+tter
4,gr(ape
5,sm\(ok\e
6,ra\in
7,p+la\\y
8,wor\+k

输出.txt

1,ap^ple
2,o$range
3,bu+tter
4,gr(ape
5,sm\(ok\e
6,ra\in
7,p+la\\y

第7行和第5行在output.txt因为有2个特殊字符(一个有反斜杠另一个没有反斜杠)

最佳答案

“最终”最终编辑:我想允许“\x”无论 x 是什么,但 OP 似乎不希望这样,所以我也修复了它。

在尝试找到一个“聪明”的正则表达式(它被“\\”或任何数量不正确的“\”阻塞,但显然对其余部分有效...)

我用 awk 重写了它,以“状态自动机”的方式完成:

想法:

如果在“正常模式”下,我们会遇到除“\”之外的特殊字符? : 我们打印这条线! 如果在“正常模式”下,我们遇到一个“\”? : 我们进入“转义模式”,在该模式下,忽略下一个字符 (但如果我们没有下一个字符,我们也需要打印该行!)

脚本:

awk -F"," '
{
IN_ESCAPED_MODE=0 ;
for (i=1 ; i<=length($2) ; i++)
{ char=substr($2,i,1)

if ( IN_ESCAPED_MODE == 0)
{ if ( index(".^$%*+?!(){}[]|",char) > 0 )
{ print $0 ; break ;
}

if ( index("\\" , char ) > 0 )
{ IN_ESCAPED_MODE=1 ; continue ;
}
}

if ( IN_ESCAPED_MODE == 1)
{ if ( index(".^$%*+?!(){}[]|\\",char) > 0 )
{ IN_ESCAPED_MODE=0 ; continue ;
}
else
{ IN_ESCAPED_MODE=0 ; print $0; break;
}
}
}

if (IN_ESCAPED_MODE == 1)
{
print $0 ; break ;
}

}
' input.txt > output.txt

通过此更改,您将获得与 OP 相同的输出,例如当包含“\e”时打印一行...我觉得这很奇怪:对我来说“\e”很好,我们可以“逃避”什么?

有了那个输入:

1,ap^ple
2,o$range
3,bu+tter
4,gr(ape
5,sm\(ok\e
6,ra\in
7,p+la\\y
8,wor\+k

10,\
11,\\
12,\\\
13,.
14,\.
15,..
16,^
17,\^
18,$
19,\$
20,%
21,\%
22,*
23,\*
24,+
25,\+
26,?
27,\?
28,!
29,\!
30,(
31,\(
32,)
33,\)
34,{
35,\{
36,}
37,\}
38,[
39,\[
40,]
41,\]
42,|
43,\|

它输出:

1,ap^ple
2,o$range
3,bu+tter
4,gr(ape
5,sm\(ok\e
6,ra\in
7,p+la\\y
10,\
12,\\\
13,.
15,..
16,^
18,$
20,%
22,*
24,+
26,?
28,!
30,(
32,)
34,{
36,}
38,[
40,]
42,|

(看来这次真的有用了!)

如果您更愿意允许任何 "\x"而不仅仅是 "x"是一个特殊字符:

改变“中间线”:

        if ( IN_ESCAPED_MODE == 1)
{ if ( index(".^$%*+?!(){}[]|\\",char) > 0 )
{ IN_ESCAPED_MODE=0 ; continue ;
}
else
{ IN_ESCAPED_MODE=0 ; print $0; break;
}
}

进入:

        if ( IN_ESCAPED_MODE == 1)
{ IN_ESCAPED_MODE=0 ; continue ;
}

出于历史原因:正则表达式(在“大多数”情况下有效,但在某些情况下会阻塞,例如,如果有“\\”):

 egrep '[^\][].^$%*+?!(){}[|]|[^\][\][^].^$%*+?!(){}[|\]'   input.txt > output.txt

但是那个不会显示第12行,例如...

一本好书:http://www.regular-expressions.info/charclass.html ....和http://www.gnu.org/software/gawk/manual/html_node/Gory-Details.html (吓人……)

关于linux - 删除具有给定模式的特殊字符的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20633351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com