【问题标题】:How to extract text between two words in unix?如何在unix中提取两个单词之间的文本?
【发布时间】:2011-09-01 22:28:36
【问题描述】:


上午
使用
基本
sed
表达式:-

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

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


上午
使用
基本
grep
表达。

我在这句话中应用了上面的sed 然后它给出了“am \n using \n basic \n grep \n expression” 它不应该给它。如何丢弃 如果没有匹配则输出?

有什么建议吗?

【问题讨论】:

  • 您在编辑中如此小心添加的所有“\n”字符是怎么回事?它们只是让您的问题难以辨认 - 但我无法完全弄清楚它们的用途,因此很难说简单地删除它们是否明智......
  • 我是新手,会尽量使其符合条件。你总能说出使问题更具可读性的技巧。感谢您的建议。
  • Amitesh:成为新手很好——我们都曾经。我只是对你试图用 '\n' 表示法实现的目标感到困惑。看起来你好像在想“如果你把这个问题作为输入,......”,但我不确定。否则,我会简单地删除所有出现的 '\n',尤其是因为该序列在 sed 脚本中具有我认为您不会追求的含义。
  • Print text between delimiters on multiple lines using sed。那是处理 '(' 和 ')' 之间的文本,但它与您所追求的并没有太大区别。主要区别在于 ')' 是单个字符,因此否定字符类 '[^)]*' 处理 '跳过无趣的东西。使用多字符分隔符并不是那么简单。
  • 嘿乔纳森,我的意思是让图片更清晰,因为单词之间有换行符,它在 sed 中很重要。

标签: unix sed pattern-matching


【解决方案1】:

问题中的命令(sed -n "/am/,/sed/p",注意添加的斜线)意思是:

  • 查找包含字符串am
  • 并打印 (p) 直到出现包含 sed 的行

因此打印:

I am using basic grep expression

因为它包含am。如果您要添加更多行,它们也会被打印,直到出现包含 sed 的行。

例如:

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"

【讨论】:

  • 我必须更详细。实际上,有多行,我们想在两个单词之间提取一些行。如果“起始词”和“停止词”匹配,那么上面的表达式就可以了。但是如果只有“起始词”而没有“停止词”,它将输出“起始词”之外的所有行。我希望你能知道。谢谢。
  • @amitesh:好的——在这种情况下,anubhava 的答案就是你所需要的。
  • 有没有办法在 2 个单词之间获取字符串(它不应该包含自己),即 am 和 sed 不应该包含在自己中
  • 另外,你的答案是只给出第一场比赛(或者可能是最后一场比赛),但是如果我想要所有的比赛呢
【解决方案2】:

您必须使用稍微不同的 sed 命令,例如:

sed -n '/am/{:a; /am/x; $!N; /sed/!{$!ba;}; /sed/{s/\n/ /gp;}}' file

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

【讨论】:

  • 单词在不同的行。请检查问题。
  • 能否在您的问题中发布您输入文件的样本?
  • 问题的第一行是输入文件。 \n 代表换行符。
【解决方案3】:

当使用 SED 时,这可以工作,但它是一个相当强大的语法...... 如果您需要裁剪多行 (\n) 文本的一部分,您可能需要尝试使用 grep 的更简单方法:

cat multi_line.txt | grep -oP '(?s)(?<=START phrase).*(?=END phrase)'

例如,我发现这是获取 perforce changelist description 的最简单方法(无需其他 CL 信息):

p4 describe {CL NUMBER} | grep -oP '(?s).*(?=Affected files)'

注意,您可以使用 = 在输出中包含或不包含开始/结束短语。

【讨论】:

  • grep -P 是一个非标准扩展,通常不可移植,尽管它适用于 GNU grep 和可能的其他一些版本。 (macOS grep 曾经有此选项,但已将其删除。)
猜你喜欢
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 2018-12-31
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多