【问题标题】:Getting a string between two string with sed使用 sed 在两个字符串之间获取一个字符串
【发布时间】:2013-08-16 00:26:00
【问题描述】:

我需要提取(使用 sed 或 grep)两个字符串之间的子字符串。

问题是前后的字符串都是带有双引号、空格等的html标签……

这是我要提取文本的一行示例:

12pt;">TEXT_TO_GET</span></div></message>

欢迎任何帮助,在此先感谢 ;)

【问题讨论】:

    标签: sed grep


    【解决方案1】:

    表面上,你可以使用sed

    sed 's%12pt;">\(.*\)</span></div></message>%\1%'
    

    或:

    sed -n '/12pt;">\(.*\)<\/span><\/div><\/message>/ s%12pt;">\(.*\)</span></div></message>%\1%p'
    

    第一个打印出不匹配的行不变;第二个只打印出匹配的行。

    但是,这是在寻找一个非常严格的上下文;如果这正是你想要的,那很好,但如果你需要改变一些东西,它很快就会变得混乱。但是,如果没有任何迹象表明需要适应哪些变化,就不可能可靠地给出更灵活的答案。

    【讨论】:

    • 不,sed 打印整行,我只需要打印中间的文本(示例中为 TEXT_TO_GET),我只需要输出。没有变化,我从文件中获取一些行,对它们进行 grep 并获得一些输出,-大部分是 html-,我需要提取一个子字符串,正如我在第一篇文章中所说的那样。 “之前和之后”子字符串将始终相同(我放在那里的那些)
    • 现在,再次阅读您的帖子,我认为您没有理解问题 xD;我在第一篇文章中放的不是整行,只是其中的一部分,之前还有更多的东西,但是这些子字符串只出现一次,总是按那个顺序,等等。
    • 这两个命令,当输入你的输入行时,都会给你TEXT_TO_GET 作为输出。它们之间的区别在于是否存在与模式不匹配的其他行。然后第一个命令回显那些其他行(未更改),第二个命令不回显它们。这似乎是你在问题和 cmets 中要求的......你试过我给你的吗?
    • 是的,我试过了并返回了所有其余的行,但别担心,我想出了另一种方法,用 2 个 seds (sed -n -e 's/.* 12pt;">//p' | sed -n -e 's/.*//p'); 非常感谢!:)
    • 您在哪个平台上运行sed 的哪个版本?我复制并粘贴了答案中的命令,它们在 Mac OS X 10.8.4 上使用提供的 BSD sed 以及 GNU sed 4.2.2 对我来说工作得很好。当然,如果12pt;部分之前的线路上有垃圾,那么你必须清理它;如果&lt;/message&gt; 部分之后有垃圾,那么你必须清理它。但问题没有提到这是一种可能性。小心你的要求;你可能会得到你所说的你想要的,而不是你想要的。
    猜你喜欢
    • 2013-11-25
    • 2012-12-28
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多