【问题标题】:SED to keep text between tags over multiple linesSED 将标签之间的文本保留在多行上
【发布时间】:2011-05-09 19:20:35
【问题描述】:

我对 sed 很陌生,因此即使查看示例,我也完全不知道如何根据需要编写正确的代码(this one 很接近,但似乎不适用于多行替换。

这是我的 input.txt

这是一个分裂的考验……

|第一个单词|第二个单词第三个单词 第四字第五字第六字

这是一个分裂的考验……

第一个单词|第二个单词|第三个单词 第四字第五字第六字

这是一个分裂的考验……

第一个单词第二个单词|第三个单词| 第四字第五字第六字

这是一个分裂的考验……

第一个单词第二个单词第三个单词 |第四字|第五字第六字

这是一个分裂的考验……

第一个单词第二个单词第三个单词 第四字|第五字|第六字

这是一个分裂的考验……

第一个单词第二个单词第三个单词 第四字第五字|第六字|

我需要做的是删除两个“|”之外的所有文本并将文本保留在两个“|”内

然后在每个单词之间插入一个 Unicode 零宽度空格 (U+200B)

导致:

firstwordU+200BsecondwordU+200BthirdwordU+200BfourthwordU+200BfifthwordU+200Bsixthword

我试过了

sed '\|/d;/|/,$d' input.txt

更新:这没什么用

sed -e 's/.*|\([^]]*\)|.*/\1/g' input.txt

这很接近,但不会从不包含“|”的行中删除任何内容(我需要删除两个“|”中未包含的所有内容,而且我不知道如何在单词之间添加零宽度空间。但就像我说的,我真的不知道自己在做什么。

任何帮助将不胜感激。

-内森

【问题讨论】:

    标签: regex sed


    【解决方案1】:

    如果您对结果感到满意

    sed -e 's/.*|\([^]]*\)|.*/\1/g' input.txt

    除了无法删除不包含分隔符的行之外,只需执行以下操作:

    sed -n -e 's/.*|\([^]]*\)|.*/\1/gp' input.txt

    只打印发生替换的行。或者,您可以明确删除不需要的行:

    sed -e '/|.*|/!d' -e 's/.*|\([^]]*\)|.*/\1/g'

    【讨论】:

    • 太好了 - 谢谢!您知道是否可以像我的示例结果那样将所有结果放在一行上?我可以通过在“\1”之前输入Unicode字符来添加它
    • 我会非常犹豫是否将 sed 用于 unicode。也许 perl 会更合适。
    • 您是否发现 Unicode 不可靠?我最终将所有内容粘贴到 Notepad ++ 中(在 Windows 中,我更熟悉它),并删除了那里的所有换行符 - 似乎一切都变成了......但也许我应该探索 perl。你有什么好地方可以去看看用 perl 做这种事情的例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2015-07-20
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多