我
我是
使用
基本的
sed
表达: -
sed -n "am/,/sed/p"
获取“am”和“sed”之间的文本 它将输出“am \ n using \ n basic \ n sed”。 但我真正的问题是如果字符串是: -
我
我是
使用
基本的
grep
表达。
我在这句话中应用了上述sed 然后它给了“我用\ n基本\ n grep \ n表达式” 它不应该给它。如何丢弃 输出如果没有匹配?
有什么建议吗?
答案 0 :(得分:13)
问题中的命令(sed -n "/am/,/sed/p"
,注意添加的斜杠)表示:
am
p
),直到包含sed
的行因此它打印:
I am using basic grep expression
因为它包含am
。如果要添加更多行,也会打印,直到包含sed
的行出现。
E.g:
echo -e 'I am using basic grep expression.\nOne more line\nOne with sed\nOne without' | sed -n "/am/,/sed/p"
结果:
I am using basic grep expression.
One more line
One with sed
我认为 - 您想要做的是这样的事情:
sed -n "s/.*\(am.*sed\).*/\1/p"
示例:
echo 'I am using basic grep expression.' | sed -n "s/.*\(am.*sed\).*/\1/p"
echo 'I am using basic sed expression.' | sed -n "s/.*\(am.*sed\).*/\1/p"
sed -n "s/.*\(am.*sed\).*/\1/p"
答案 1 :(得分:3)
你必须使用稍微不同的sed命令,如:
sed -n '/am/{:a; /am/x; $!N; /sed/!{$!ba;}; /sed/{s/\n/ /gp;}}' file
仅打印包含跨越多行的文字am
和sed
的行。
答案 2 :(得分:1)
当使用SED时,这可以工作,但这是一种压倒性的语法...... 如果您需要裁剪多行(\ n)文本的一部分,您可能希望尝试使用 grep 更简单的方法:
cat multi_line.txt | grep -oP '(?s)(?<=START phrase).*(?=END phrase)'
例如,我发现这是获取 perforce更改列表描述的最简单方法(没有其他CL信息):
p4 describe {CL NUMBER} | grep -oP '(?s).*(?=Affected files)'
注意,您可以使用&lt; =和&gt; =来包含或不包含输出中的开始/结束短语。