unix 我想显示包含一个方括号的行,方括号可以是开括号,也可以是闭括号,

7uzetpgm  于 5个月前  发布在  Unix
关注(0)|答案(2)|浏览(100)

就像我有一个数据,
一个具有开括号,另一个具有闭括号。
我期待像我有txt文件,我有两个错误,而进入和失踪想回显所有的开放,但没有关闭的发生,而另一个是如果只有关闭本.我使用bash代码,但它只显示开放的发生,但没有关闭括号我的代码是grep -E '^[^()]*\([^()]*$|^[^()]*[^()]*\([^()]*$',这只显示( abc的结果
但不是abc)。请帮助我谢谢。

b91juud3

b91juud31#

也许这个正则表达式就是你要找的

grep -E '^[^()]*[()]{1}[^()]*$'

字符串

xuo3flqw

xuo3flqw2#

grep是高度优化的,所以不完全 * 可编程 *。我使用sed

$: cat file
 foo
 1 -> (abc
 bar
 baz
 2-> abc)
 a,b,c,(d,e,(f,g,h),k,l),m,n,(0
 qux
 ( ( ( ( ) ) ( ) ( ( ) ) ) ) ( ( ) ( ) -> ) (

字符串
这在GNU sed中运行得很好:

$: sed -n 'h; :x; s/([^()]*)//; tx; /[()]/{=;x;p}' file | paste -d: - -
2: 1 -> (abc
5: 2-> abc)
6: a,b,c,(d,e,(f,g,h),k,l),m,n,(0
8: ( ( ( ( ) ) ( ) ( ( ) ) ) ) ( ( ) ( ) -> ) (


越狱了-
-n表示n o打印,除非明确要求。
h表示h在保持缓冲区中保留原始文本行,以便稍后报告。
:x声明了一个label,用于循环返回,见下文。
s/([^()]*)//删除了最里面的 * 匹配对 * 括号。
tx循环回x标签 *,如果进行了替换 *。
/[()]/{...}扫描这一行,看看上面是否还有括号.
=报告行号。
x将e x更改h eld原件的编辑行,以便
p可以p rint它,因为它有不匹配的括号。
我将它通过paste -d: - -传输,以便将行号和行放在输出的同一行上。
我 * 认为 * 唯一特定于GNU的特性是使用分号而不是换行符,所以如果需要的话,它应该很容易适应。

相关问题