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)
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)