我需要删除由连字符后跟空格组成的所有字符串,但只有当空格后面没有单词“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.
有什么想法吗?
答案 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
,这样我们就可以将字符串转换为'对[{1}}和- og
感兴趣的是- eller
,例如a<some other character>
和aB
,此时我们知道输入中aC
和aB
的唯一出现是新转换的{{1} }和aC
因为所有现有的- og
现在都是- eller
。
现在,我们可以从文件中删除所有剩余的a
,然后将aA
转换回-
和aC
返回- eller
s,最后所有aB
返回到原来的- og
。
答案 3 :(得分:1)
这可能适合你(GNU sed):
sed -r 's/(- (og|eller))|- /\1/g' file
这依赖于交替重新替换特定情况和空反向引用来取代一般情况。