这是可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行的命令 sgrep,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
sgrep - 在文件中搜索结构化模式
概要
sgrep [-accddhiilNnPqSsTtV[-g 选项[-O 文件名[-o "格式"] [-p 预处理器[-w
坦克 名单[-x 文件名[-e] 表达 [文件名 ...]
sgrep [-accddhiilNnPqSsTtV[-g 选项[-O 文件名[-o "格式"] [-p 预处理器[-w
坦克 名单[-x 文件名] -f 文件名 [-e 表达[文件名 ...]
sgrep [-accddhiilNnPqSsTtV[-g 选项[-O 文件名[-o "格式"] [-p 预处理器[-w
坦克 名单[-x 文件名] -f 文件名 -F 文件名 [-e 表达]
sgrep -h
商品描述
sgrep (结构化的 grep) 是一个搜索工具 文本 档 和过滤 文本 流
使用结构标准。 sgrep的数据模型基于 地区,它们是非
文本的空子串。 地区 通常是常量字符串的出现或
有意义的文本元素,可以通过一些分隔字符串来识别。 地区
可以任意长,任意重叠,任意嵌套。
sgrep 使用称为的模式 地区 表达式 表达输入文本的哪些区域
输出到标准输出。 区域的选择是基于相互的 遏制 和
订购 条件 的区域,由区域表达式表示。
区域 表达式 默认情况下首先从文件中读取 $HOME/.sgreprc, 或者如果没有
存在,来自文件 /usr/lib/sgreprc, 然后从命令行。 不同的行为可以
通过命令行选项指定。
输入 档 被一一处理(即区域不能超出文件边界),
除非 -S 给出标志,在这种情况下 sgrep 连接输入
文件作为其输入文本。 如果没有给出输入文件, sgrep 读取标准输入。
通过将连字符“-”作为文件名,也可以将标准输入指定为输入文件。
所选区域按其起始位置的升序输出。 如果几个
输出区域重叠,覆盖它们的最小区域是输出,默认情况下,
而不是分别输出它们中的每一个。
配置
-a 作为过滤器:显示匹配的区域,可能根据
输出格式,与文本的其余部分交错。 (见说明
下面的选项 -o。)
-C 显示版权声明。
-c 仅显示与表达式匹配的区域计数。
-D 显示详细的进度输出。 注意: 这仅用于调试目的
并且可能在 sgrep 的未来版本中不起作用。
-d 显示每个匹配区域一次,即使这些区域重叠或嵌套。
-e 表达
在输入文本中搜索出现的 表达.
-f 文件
从命名文件中读取区域表达式。 文档名称 - 指的是标准输入。
-F 文件名
从中读取输入文件列表 文件名 而不是命令行
-g 选项
设置扫描仪选项。 选项 可以是以下任何一种:
符号表 使用 SGML 扫描仪
HTML 使用 HTML 扫描器(目前与 SGML 扫描器相同)
XML 使用 XML 扫描器
sgml 调试
显示已识别的 SGML 令牌
包含实体
自动包含系统实体
-h 显示简短的帮助。
-i 忽略短语中的大小写区别。
-I 当作为第一个选项给出时,切换到索引模式
-l 长输出格式:在每个输出区域前面加一行,表示
区域的序号,区域开始的文件名,
该区域的长度(以字节为单位),该区域在该区域内的开始和结束位置
整个输入文本,文件中包含该区域的起始位置
开始,以及包含结尾的文件中区域的结束位置。
-N 不要在最后一个输出区域后添加换行符。
-n 抑制阅读 $HOME/.sgreprc or /usr/lib/sgreprc。
-O 文件
从文件中读取输出格式。 请参阅下面的输出格式说明。
-o 格式
设置输出格式。 格式为每个输出区域显示
出现以下占位符替换:
%f 包含区域开头的文件名
%s 区域起始位置
%e 区域结束位置
%l 以字节为单位的区域长度(即 %e-%s+1)
%i 区域开始的文件中区域的起始位置
%j 区域结束的文件中区域的结束位置
%r 区域的文本。 “%r”是默认的输出格式。
%n 获取区域的序号
-P 显示(预处理的)区域表达式而不执行它。
-p 预处理器
入学申请 预处理器 在评估它之前到区域表达式。
-S 流模式。 使用此选项 sgrep 将其输入文件视为连续的
流,以便区域可以跨越文件边界扩展。
sgrep -S 文件_1 ... 文件_n
类似于
猫文件_1 ...文件_n | sgrep
除了后者创建输入流的临时磁盘文件。 斯格雷普
运行时可能会使用更多内存 -S 选项,从那时起它无法释放
它的内部区域列表在处理每个文件之间。
-s 短输出格式(默认):不格式化输出区域的文本,并且
仅显示一次区域的重叠部分。
-T 显示有关执行的统计信息。
-t 显示时间使用情况。
-V 显示版本信息。
-v 详细模式。 显示正在发生的事情。
-w 坦克 名单
设置用于识别单词的字符列表。
-x 文件名
使用给定的索引文件而不是扫描仪。 暗示-S。
-- 没有更多选择。
选项列表也可以作为环境变量的值给出 SGREPOPT.
句法 OF 表情
region_expr -> basic_expr
| 运算符表达式
operator_expr -> region_expr ['not'] 'in' basic_expr
| region_expr ['not'] '包含' basic_expr
| region_expr ['not'] '相等' basic_expr
| region_expr '或' basic_expr
| region_expr '提取' basic_expr
| region_expr '..' basic_expr
| region_expr '_.' 基本表达式
| region_expr '._' basic_expr
| region_expr '__' basic_expr
| region_expr '引用' basic_expr
| region_expr '_quote' basic_expr
| region_expr 'quote_' basic_expr
| region_expr '_quote_' basic_expr
| 'concat' '(' region_expr ')'
| '内部' '(' region_expr ')'
| '外' '(' region_expr ')'
| '加入''('整数','region_expr')'
basic_expr -> 短语
| '开始'
| '结尾'
| '字符'
| 常量列表
| '(' region_expr ')'
短语 -> '"' char [ char ... ] '"'
常量列表 -> '[' ']' | '['地区']'
地区 -> 地区
| 地区 地区
区域 -> '('整数','整数')'
请注意,区域表达式是左关联的。 这意味着,例如,一个
表达
'" ".." " 或 " "'
计算以“ ”开头并以“ ”结尾的区域,或仅包含
字符串“”。 为了获得以“ ”开头并以
无论是“ ”还是“ ”,都应该使用
括号:
" ".. (" " 或 " ")
表达式还可以包含 注释, 以“#”开头并延伸到结尾
线。 但是,短语中的“#”符号不会开始注释。
语义 OF 表情
表达式的值是一组满足表达式的输入文本区域。
价值观 v(基本表达式) 一个基本表达式:
v(短语):=
输入文本区域的集合,其文本等于短语的文本。
v('开始'):=
由每个输入的第一个位置的单字符区域组成的集合
文件。 如果给出了 -S 选项,则该值是一个包含单个区域的集合
包含输入流中的第一个字符。
v('结束'):=
由每个输入的最后一个位置的单字符区域组成的集合
文件。 如果给出了 -S 选项,则该值是一个包含单个区域的集合
包含输入流中的最后一个字符。
v('字符'):=
由所有单字符区域组成的集合。
v([ ]):=
一个空集。
v([(s_1,e_1) (s_1,e_2) ... (s_n,e_n)]):=
由区域组成的集合 r_i 每 i = 1,...,n, 的起始位置
地区 r_i is s_i 它的结束位置是 e_i。 职位必须是
非负整数,并且区域必须按照它们的升序给出
起始位置; 具有共同起始位置的区域必须在
其结束位置的递增顺序。 位置从第一个开始计算
每个输入文件的字符,除非给出了 -S 选项,在这种情况下
位置从输入流的开头开始计算。 号码
文件或流中的第一个位置为零。
v('('region_expr')'):= v(region_expr)。
价值观 v(运算符_表达式) 运算符表达式:
v(区域表达式 '在' 基本表达式):=
区域的集合 v(区域表达式) 包含在某些地区的
v(基本表达式). 一个地区 x 包含在另一个区域 y 当且仅当
的开始位置 x 大于起始位置 y 和结束位置
x 不大于结束位置 y,或结束位置 x 较小
比结束位置 y 和开始位置 x 不小于
的开始位置 y.
v(区域表达式 '不是' '在' 基本表达式):=
区域的集合 v(区域表达式) 不包含在任何区域的
v(basic_expr)。
v(区域表达式 '包含' 基本表达式):=
区域的集合 v(区域表达式) 包含某些区域的 v(basic_expr)。
v(区域表达式 '不是' '包含' 基本表达式):=
区域的集合 v(区域表达式) 不包含任何区域的
v(basic_expr)。
v(区域表达式 '平等的' 基本表达式):=
出现在两个区域的区域集 v(区域表达式) 和 v(basic_expr)。
v(区域表达式 '不是 平等的' 基本表达式):=
区域集,出现在 v(区域表达式) 但不会发生在
v(basic_expr)。
v(区域表达式 '或者' 基本表达式):=
出现在的区域集 v(区域表达式) 或 v(基本表达式) 或
都。
v(区域表达式 '提取' 基本表达式):=
由区域组成的非空区域的集合 v(区域表达式)
通过提取与任何区域的重叠 v(basic_expr)。 例如,值
of
'[(1,4) (3,6) (7,9)] 提取 [(2,5) (4,7)]'
由区域 (1,1) 和 (8,9) 组成。
v(区域表达式 '..' 基本表达式):
该表达式的值由可以通过以下方式形成的区域组成 配对
地区来自 v(区域表达式) 地区来自 v(basic_expr)。 配对是
定义为嵌套括号配对方式的概括
“由内而外”。 为此,我们需要能够比较区域的顺序,
这可能是重叠和嵌套的。 该排序定义如下。
让 x 和 y 是两个区域。 我们说那个地区 x 先于 地区 y 如果结束
的位置 x 小于起始位置 y. 我们说那个地区 x is
后来 比地区 y 如果结束位置 x 大于结束位置 y,
或者如果它们在相同的位置结束并且开始 x 大于开始
y. 区域 x is 早期 比地区 y 如果开始位置 x 小于
的开始位置 y, 或者如果他们在相同的位置和结束位置开始
of x 小于结束位置 y. 现在一个地区 x 在 v(区域表达式) 和
地区 y 在 v(基本表达式) 在表达式中配对 v(区域表达式 '..' 基本表达式)
当且仅当
1. x 先于 y,
2. x 未与来自的任何区域配对 v(基本表达式) 这是早于 y,
和
3. y 未与来自的任何区域配对 v(区域表达式) 晚于 x.
区域配对 x 和 y 形成从开始位置延伸的区域 x 至
的结束位置 y.
v(区域表达式 '._' 基本表达式):
区域的配对来自 v(区域表达式) 以及来自的地区 v(基本表达式)
定义类似于 v(区域表达式 '..' 基本表达式) 以上, 除了
区域配对 x 和 y 现在形成一个从起始位置延伸的区域
of x 到紧接开始前的位置 y.
v(区域表达式 '_.' 基本表达式):=
区域的配对来自 v(区域表达式) 以及来自的地区 v(基本表达式)
定义类似于 v(区域表达式 '..' 基本表达式) 以上, 除 这 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。
区域配对 x 和 y 现在形成一个从位置延伸的区域
紧跟在 的结束位置之后 x 到结束位置 y.
v(区域表达式 '__' 基本表达式):=
区域的配对来自 v(区域表达式) 以及来自的地区 v(基本表达式)
定义类似于 v(区域表达式 '..' 基本表达式) 以上,除了现在
区域配对 x 和 y 形成从文本位置延伸的区域
紧随其后 x 到紧接在前面的文本位置
开始 y. 结果中排除了可能产生的空区域。
v(区域表达式 '引用' 基本表达式):
此表达式的值由从开始扩展的区域组成
“的位置左引号 地区“中 v(区域表达式) 到 a 的结束位置
相应的 ”正确引用 地区“中 v(基本表达式). 结果中的区域是
非嵌套和非重叠。 左引号区域和右引号
区域定义如下:
· 最早的地区(见上) v(区域表达式) 是一个 可能 左引号
地区.
· 对于每个可能的左引号区域 x, 最早的地区 v(基本表达式)
之前 x 是它的右引号区域。
· 对于每个右引号区域 y in v(基本表达式), 最早的地区
v(区域表达式) 之前 y 是一个可能的左引号区域。
下面的示例查询查找 C 样式的非嵌套注释:
“/*“ 引用 ”*/”
下面的示例查询查找引号之间的字符串:
“\““ 引用 ”\””
(注意表达的不同 "\"" .. "\"", 它将评估为任何子字符串
以引号开头并以下一个引号结尾的输入文本。)
变体 _引用, 引用_ 和 _引用_ 类似于运算符 _., ._ 和 __在
意思是“引用区域”起源于侧面的表达
下划线 _ 被排除在结果区域之外。 (如果是 _引用_ 任何可能
结果空区域被排除在结果之外。)
v('连接' '(' 区域表达式 ')' ):=
输入文本的最长区域的集合,这些区域被 中的区域覆盖
v(region_expr)。
v('内部' '(' 区域表达式 ')' ):=
区域的集合 v(区域表达式) 不包含任何其他区域的
v(region_expr)。 请注意,对于任何区域表达式 A, 表达方式 内部(A) is
相当于 (A 而不去 包含 A).
v('外部' '(' 区域表达式 ')' ):=
区域的集合 v(区域表达式) 不包含在任何其他区域的
v(region_expr)。 请注意,对于任何区域表达式 A, 表达方式 外层(A) is
相当于 (A 而不去 in A).
v('加入' '(' n ',' 区域表达式 ')' ):
这个表达式的值是通过处理 v(region_expr) 的区域形成的
按开始位置的递增顺序(并按结束位置的递增顺序)
具有共同起点的区域的位置)。 各地区 r 产生结果区域
从 r 的开头开始并在之后延伸到第 (n-1) 个区域的结尾
河该操作仅对非嵌套区域有用。 尤其是当应用
到'chars',它可以用来表示接近条件。 例如,
'"/*" 引用 "*/" in join(10,chars)'
选择最多 10 个字符长的注释“/* ... */”。
示例 OF 地区 表情
计算文件 eval.c 中字符串“sort”的出现次数:
sgrep -c '"sort"' eval.c
显示文件 eval.c 中所有由大括号分隔的块:
sgrep '"{" .. "}"' eval.c
显示包含“sort”或“nest”的最外面的块:
sgrep 'outer("{" .. "}" contains ("sort" or "nest"))'\
评估文件
在扩展名为 .c 的文件中显示所有包含“sort”但不包含“nest”的行,以
文件名:
sgrep -o "%f:%r" '"\n" _. “\n”包含“排序”\
不包含“巢”'*.c
(注意这个查询会省略第一行,因为它没有前面的换行符
字符 '\n' 以及最后一个,如果没有以换行符结束。 对于正确的方法
要表达文本行,请参阅下面的 LINE 宏定义。)
显示条件语句的开头,由“if”后跟一个条件组成
在括号中,在文件 *.c 中。 查询必须忽略评论中出现的“if”
"/* ... */" 或在以 '#' 开头的编译器控制行上:
sgrep '"if" not in ("/*" quote "*/" or ("\n#" .. "\n")) \
.. (“(“ .. “)“)' *。C
在条件部分显示包含字符串“access”的 if 语句出现在
源文件*.c中程序的主要功能:
sgrep '"if" not in ("/*" quote "*/" or ("\n#" .. "\n")) \
.. ("(" .. ")") 包含“访问”\
in ("main(" .. ("{" .. "}")) \
.. ("{" .. "}" 或 ";")' *.c
我们看到复杂的条件可能变得相当难以辨认。 谨慎使用
旨在 宏 可以使表达查询变得更加容易。 例如,可以给出
在文件中的 m4 宏处理器定义下方,例如 c.macros:
定义(块,(“{”..“}”))
定义(评论,(“/*”引用“*/”))
变更通信(%)
定义(CTRLINE,(“#”在开始或“\n#”
_. ("\n" 或结束) ))
定义(IF_COND,(“如果”不在(COMMENT 或 CTRLINE)中)
.. ("(" .. ")")))
那么上面的查询可以更直观地写成
sgrep -p m4 -f c.macros -e 'IF_COND 包含“访问”\
in ( "main(" .. BLOCK ) .. (BLOCK or ";")' *.c
优化
sgrep 对查询表达式执行公共子表达式消除,使重复出现
子表达式只计算一次。 例如,在表达式中
'(" " or "\n" or "\t") .. (" " or "\n" or "\t")'
子表达式
'(" " 或 "\n" 或 "\t")'
仅评估一项。
诊断
如果找到任何匹配区域,则退出状态为 0,如果没有找到,则为 1,对于语法错误或
无法访问的文件(即使找到了匹配的区域)。
环境
sgrep 自己的默认选项可以作为环境变量的值给出
SGREPOPT. 例如,执行
setenv SGREPOPT '-p m4 -o %r\n'
使 sgrep 将 m4 预处理器应用于表达式并将每个输出区域显示为
之后是换行符。
使用 onworks.net 服务在线使用 sgrep