如何在unix中的两个单词之间提取文本?

时间:2011-05-25 16:32:04

标签: unix sed pattern-matching

我 我是 使用
基本的 sed
表达: -

sed -n "am/,/sed/p" 

获取“am”和“sed”之间的文本 它将输出“am \ n using \ n basic \ n sed”。 但我真正的问题是如果字符串是: -

我 我是 使用
基本的 grep
表达。

我在这句话中应用了上述sed 然后它给了“我用\ n基本\ n grep \ n表达式” 它不应该给它。如何丢弃 输出如果没有匹配?

有什么建议吗?

3 个答案:

答案 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

仅打印包含跨越多行的文字amsed的行。

答案 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; =来包含或不包含输出中的开始/结束短语。