使用Grep或Sed获取文本beetween {}

时间:2018-01-26 15:49:05

标签: bash sed grep

Stack Overflow上的第一个线程,

我正在学习bash,我无法想象如何使用Grep或Sed来使用特定的。我想提取/打印特定字符之间的所有数据,如{和}或[和]。 我搜索了很多,但如果这两个字符不在同一条线上,我就找不到任何与之相关的内容。 我希望你能帮帮我 ! 提前致谢

4 个答案:

答案 0 :(得分:0)

您可以将sed用于{}这样的案例

sed 's!.*{\(.*\)}.*!\1!'

\1是一个“记住模式”,可以记住(。*)中的所有内容

答案 1 :(得分:0)

没有意识到OP在两个单独的行中有{}sed会更容易,

 $ sed -n '/{/,/}/{//!p}' inputfile

对于方括号,您必须转义字符:

 $ sed -n '/\[/,/\]/{//!p}' inputfile

inputfile中:

$ cat inputfile
Some text inside
{
between braces
}
some other text

[
between square bracket
]

some more text

输出:

$ sed -n '/{/,/}/{//!p}' inputfile
between braces

$ sed -n '/\[/,/\]/{//!p}' inputfile
between square bracket

如果它们位于同一行,请使用perl-style-regex中的grep-o选项:

 $ echo 'Some text {between}'  | grep -o -P '(?<=\{).*(?=\})' 
 between

 $ echo 'Some text [between]'  | grep -o -P '(?<=\[).*(?=\])' 
 between

答案 2 :(得分:0)

使用现代grep(2.6.3+) - 很容易:

[root@s]$ cat test
aa{bb]
cc}dd [ee] ff [gg
hh] ii {jj} kk
[root@s]$ <test grep -z -P '({[^}]+}|\[[^]]+\])' -o
{bb]
cc}
[ee]
[gg
hh]
{jj}

如果您的grep为2.5.1或更低(其中-z不存在且-P执行不当) - 输入需要先转换为1行。 示例:tr '\n' '\t'用制表符替换所有换行符(如果需要,可以在处理后进行相反的替换)。

how it shows in color

[root@s]$ <test tr '\n' '\t'|grep '\(\[[^]]*\]\|{[^}]*}\)' --color=always|tr '\t' '\n'
aa{bb]
cc}dd [ee] ff [gg
hh] ii {jj} kk

[root@s]$ <test tr '\n' '\t'|grep '\(\[[^]]*\]\|{[^}]*}\)' -o
{bb]    cc}
[ee]
[gg     hh]
{jj}

对于这两个版本您可以选择更具吸引力的演示文稿(-o--color=always)。

P.S。所有上述假设输入

中没有嵌套/转义那些{} []字符

答案 3 :(得分:0)

你可以试试这个sed,但是用awk

会更好
sed '
/{/!d
s/[^{]*//
:A
$bB
N
/}/!bA
:B
s/}[^}]*$/}/
t
d
' infile