带有 sed 的多个模式(正则表达式 AND 或条件)

Joj*_*leo 3 grep sed text-processing

我想删除不需要的数据。所以我的问题是,如果 test1 上面不包含 test1不以引号结尾,我该如何删除它?

20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
**This is some unwanted data to remove**
20  /test1/type="Western"
20  /test1/end=category
**This is some unwanted data to remove**
20  /test1/Purpose=
20  /test1/my_purpose="To create 
a fun-filled moment"
20  /test1/end=Purpose
Run Code Online (Sandbox Code Playgroud)

预期输出:

20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20  /test1/type="Western"
20  /test1/end=category
20  /test1/Purpose=
20  /test1/my_purpose="To create 
a fun-filled moment"
20  /test1/end=Purpose
Run Code Online (Sandbox Code Playgroud)

我被这几个命令困住了:

1. grep -B1 'test1' test_long_sentence.txt
2. sed '/test1/!d' test_long_sentence.txt 
3. sed '/\"$/!d' test_long_sentence.txt
Run Code Online (Sandbox Code Playgroud)

我不知道如何结合没有。2 和 3(带有正则表达式和 OR 条件的多个命令的 sed)

Kus*_*nda 5

lex(或flex在 Linux 系统上)是一个采用扫描器/词法分析器规范并将其转换为 C 程序的程序。它的扫描器规范本质上类似于awk程序,但awk面向记录的地方lex是“面向字符的”。

使用lex在以下来源lexer.l

%x OUTPUT
%%
                        int quoted = 0;

^[0-9]*[ \t]*"/test1/"  { BEGIN OUTPUT;             ECHO; }
<OUTPUT>\n              { if (!quoted) { BEGIN 0; } ECHO; }
<OUTPUT>[^\\]["]        { quoted = !quoted;         ECHO; }
<OUTPUT>.               {                           ECHO; }
.|\n                    ;
Run Code Online (Sandbox Code Playgroud)

这个扫描器使用一个OUTPUT状态来跟踪我们是否想要输出当前字符。BEGIN OUTPUT当我们找到一条看起来像的线时,我们进入这种状态

<number>  /test1/
Run Code Online (Sandbox Code Playgroud)

(这是由第一条规则处理的)。当一行结束并且我们当前没有扫描带引号的字符串时,我们退出此状态(这由第二条规则处理)。

带引号的字符串以未转义的"字符开头和结尾(第三条规则)。所有其他字符按原样传递,无需操作(第四条规则)。

虽然不在OUTPUT状态中,我们忽略一切(最后一条规则)。

请注意,这是为您的特定数据编写的临时扫描程序。它不处理以转义反斜杠 ( "some data \\")结尾的带引号的字符串,但它适用于您显示的数据。

构建它:

$ make lexer
lex  -o lex.lexer.c lexer.l
cc -O2 -pipe    -o lexer lex.lexer.c  -ll
rm -f lex.lexer.c
Run Code Online (Sandbox Code Playgroud)

(在 Linux 上,使用 时flex,您可能必须使用make lexer LDLIBS=-ll

使用它:

$ ./lexer <file
20  /test1/catergory="Food"
20  /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20  /test1/type="Western"
20  /test1/end=category
20  /test1/Purpose=
20  /test1/my_purpose="To create
a fun-filled moment"
20  /test1/end=Purpose
Run Code Online (Sandbox Code Playgroud)