如何使用sed匹配未后跟单词的字符串

时间:2016-07-01 15:32:30

标签: regex sed

我需要删除由连字符后跟空格组成的所有字符串,但只有当空格后面没有单词“og”时才会删除。 示例文件:

Kultur- og idrettsavdelinga skapar nyska- pande kunst og utvik- lar samfunnet

我尝试了否定前瞻:

sed -e 's/- (?!og)//g'

但它不起作用。我想要的是这样的:

Kultur- og idrettsavdelinga skapar nyskapande kunst og utviklar samfunnet.

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

sed没有预测功能,但您可以描述所有可能性:

sed -e 's/\(- \(- \)*\)\([^o]\|$\|o\([^g]\|$\)\)/\3/g'

您可以使用以下代码进行测试:- - - - og - - oa - o => - og oa o

答案 1 :(得分:1)

您还可以使用 sed链,先用无意义的内容替换- og(例如booogabooga),然后执行替换,然后撤消booogabooga

sed -e 's/- og/booogabooga/g; s/- //g; s/booogabooga/- og/g'

某些版本的 sed 可能需要:

sed -e 's/- og/booogabooga/g' -e 's/- //g' -e 's/booogabooga/- og/g'

这可能会更慢,更痛苦,特别是如果您有多个替换品,如@Kusalananda建议,但它更容易理解。

答案 2 :(得分:1)

鉴于此输入文件(我添加了- eller,因为您在评论中说过,您也需要处理它们):

$ cat file
Kultur- og idrettsavdelinga skapar- eller nyska- pande kunst og utvik- lar- eller samfunnet

这是常见的sed惯用法:

$ sed 's/a/aA/g; s/- og/aB/g; s/- eller/aC/g; s/- //g; s/aC/- eller/g; s/aB/- og/g; s/aA/a/g' file
Kultur- og idrettsavdelinga skapar- eller nyskapande kunst og utviklar- eller samfunnet

上述方法的工作原理是将所有a(或您喜欢的其他字符不在目标字符串中)转换为aA,这样我们就可以将字符串转换为&#39;对[{1}}和- og感兴趣的是- eller,例如a<some other character>aB,此时我们知道输入中aCaB的唯一出现是新转换的{{1} }和aC因为所有现有的- og现在都是- eller

现在,我们可以从文件中删除所有剩余的a,然后将aA转换回-aC返回- eller s,最后所有aB返回到原来的- og

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed -r 's/(- (og|eller))|- /\1/g' file

这依赖于交替重新替换特定情况和空反向引用来取代一般情况。