【问题标题】:Using GREP to replace all but matched string使用 GREP 替换所有未匹配的字符串
【发布时间】:2015-10-14 19:36:45
【问题描述】:

我正在使用 TextWrangler 从 XML 中获取特定信息。我需要找到存在的文件名列表并仅打印出这些文件名。

代码示例如下:

<file id="file_1045280">
    <name>SKY_A026C032_150707_R4RO.mov</name>
    <pathurl>file://localhost/M:/FPL_MEDIA/04_MEZZANINE/SKY/SKY-EP03/SKY-0312_20150707_AA_A026/SKY_A026C032_150707_R4RO.mov</pathurl>
    <duration>1796</duration>
    <timecode>
        <rate>
            <ntsc>false</ntsc>
            <timebase>25</timebase>
        </rate>
        <frame>0</frame>
        <displayformat>NDF</displayformat>
    </timecode>
    <media>
        <video>
            <duration>1796</duration>
            <samplecharacteristics>
                <width>1920</width>
                <height>1080</height>
            </samplecharacteristics>
        </video>
    </media>
</file>
                            <sourcetrack>
                                <mediatype>video</mediatype>
                            </sourcetrack>
                            <link>
                                <linkclipref>clipItem_1045280</linkclipref>
                                <mediatype>video</mediatype>
                                <trackindex>1</trackindex>
                            </link>
                        </clipitem>
                        <enabled>TRUE</enabled>
                        <locked>FALSE</locked>
                    </track>
                </video>
            </media>
        </clip>
        <clip id="clip_1045282">
            <name>SKY_A026C018_150707_R4RO</name>
            <duration>958</duration>
            <rate>
                <ntsc>false</ntsc>
                <timebase>25</timebase>
            </rate>
            <in>-1</in>
            <out>-1</out>
            <masterclipid>clip_1045282</masterclipid>
            <ismasterclip>TRUE</ismasterclip>
            <media>
                <video>
                    <track>
                        <clipitem id="clipitem_1045282">
                            <name>SKY_A026C018_150707_R4RO</name>
                            <duration>958</duration>
                            <masterclipid>clip_1045282</masterclipid>
                            <rate>
                                <ntsc>false</ntsc>
                                <timebase>25</timebase>
                            </rate>
                            <in>0</in>
                            <out>958</out>
                            <start>0</start>
                            <end>958</end>
<file id="file_1045282">
    <name>SKY_A026C018_150707_R4RO.mov</name>
    <pathurl>file://localhost/M:/FPL_MEDIA/04_MEZZANINE/SKY/SKY-EP03/SKY-0312_20150707_AA_A026/SKY_A026C018_150707_R4RO.mov</pathurl>
    <duration>958</duration>
    <timecode>
        <rate>
            <ntsc>false</ntsc>
            <timebase>25</timebase>
        </rate>
        <frame>0</frame>
        <displayformat>NDF</displayformat>
    </timecode>
    <media>
        <video>
            <duration>958</duration>
            <samplecharacteristics>
                <width>1920</width>
                <height>1080</height>
            </samplecharacteristics>
        </video>
    </media>
</file>
                            <sourcetrack>
                                <mediatype>video</mediatype>
                            </sourcetrack>
                            <link>
                                <linkclipref>clipItem_1045282</linkclipref>
                                <mediatype>video</mediatype>
                                <trackindex>1</trackindex>
                            </link>
                        </clipitem>
                        <enabled>TRUE</enabled>
                        <locked>FALSE</locked>
                    </track>
                </video>
            </media>
        </clip>
        <clip id="clip_1045283">
            <name>SKY_A026C033_150707_R4RO</name>
            <duration>1202</duration>
            <rate>
                <ntsc>false</ntsc>
                <timebase>25</timebase>
            </rate>
            <in>-1</in>
            <out>-1</out>
            <masterclipid>clip_1045283</masterclipid>
            <ismasterclip>TRUE</ismasterclip>
            <media>
                <video>
                    <track>
                        <clipitem id="clipitem_1045283">
                            <name>SKY_A026C033_150707_R4RO</name>
                            <duration>1202</duration>
                            <masterclipid>clip_1045283</masterclipid>
                            <rate>
                                <ntsc>false</ntsc>
                                <timebase>25</timebase>
                            </rate>
                            <in>0</in>
                            <out>1202</out>
                            <start>0</start>
                            <end>1202</end>

目前,我正在使用以下 Grep:

.*?(\<name\>)(.*)(.mov).*

这可以找到我需要的字符串。但是,我需要用任何内容替换所有剩余的文本,即留下一个文件名列表。

谁能告诉我如何解决这个问题?

提前致谢, 马特

【问题讨论】:

  • 你需要输出只有&lt;name&gt;SKY_A026C032_150707_R4RO.mov&lt;/name&gt;&lt;name&gt;SKY_A026C018_150707_R4RO.mov&lt;/name&gt;吗?
  • 在理想的解决方案中,我希望输出仅为 SKY_A026C032_150707_R4RO.mov,减去 标签,但您的解决方案就足够了,因为我可以运行第二个 Grep .
  • 你安装了 perl 吗?
  • 很遗憾没有。它需要在 TextWrangler 中完成,因为它需要在锁定的 XSAN 环境中运行,而这是我们 SOE 上唯一可用的软件。
  • 很抱歉,grep 误导了我,我无法进一步帮助您。

标签: regex grep textwrangler


【解决方案1】:

使用 TextWrangler,一种快速的方法是首先使用 -> Text -> Process Lines Containing... 使用 Grep 搜索 &lt;name&gt;.+\.mov&lt;/name&gt; 复制到新文档 已选中。
可以清理生成的文件,搜索(类似的东西)^\s*&lt;name&gt;(.+\.mov)&lt;/name&gt;\s*$ 并用 \1 替换并检查 Grep

【讨论】:

    【解决方案2】:

    这个怎么样。有一点重叠,但这意味着

    "match everything as if it's a single line that 
    [comes after </name> and before <name>], or 
    [is between the beginning and <name>] or 
    [is the <name> or </name> tags itself].
    
    (?ms)(?<=<\/name>)(.*?)(?=<name>)|(^.*?<name>)|(<.?name>)
    
    https://regex101.com/r/vV4xZ6/2
    

    【讨论】:

    • 这非常接近@ergonaut,谢谢。有没有办法只列出以 .mov 结尾的文件名的实例?那么 标签之后的文件名实例,而不是 标签?这样,每个文件只列出一次实际的文件名。
    • 这很复杂,最好的解决方案是使用实际的解析器。
    • 恐怕我不知道那是什么意思?本质上,我只是想找到您所做的以 .mov 结尾的 Grep 的结果。我尝试将您的表达式修改为反映这一点,但它总是找到 标签之间包含的任何内容。有没有办法修改它,使其向前/向后意味着 之间的字符串必须以.mov 在替换后保留吗?
    • 或者,在 之前的最后一个正斜杠之后查找字符串,例如/SKY_A026C032_150707_R4RO.mov 会给出相同的结果吗?
    • 对不起,我没有答案。但是,我的回答是您最初的否定情况。取正面案例可能更容易,并将其提取到单独的文件中。
    猜你喜欢
    • 2016-09-26
    • 2020-06-23
    • 2022-11-19
    • 2011-08-29
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    相关资源
    最近更新 更多