Stack Overflow上的第一个线程,
我正在学习bash,我无法想象如何使用Grep或Sed来使用特定的。我想提取/打印特定字符之间的所有数据,如{和}或[和]。 我搜索了很多,但如果这两个字符不在同一条线上,我就找不到任何与之相关的内容。 我希望你能帮帮我 ! 提前致谢
答案 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'
用制表符替换所有换行符(如果需要,可以在处理后进行相反的替换)。
[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