Regex 如何使用sed匹配后面没有单词的字符串
我需要删除所有由连字符后跟空格组成的字符串,但仅当空格后面没有单词og时。 示例文件:Regex 如何使用sed匹配后面没有单词的字符串,regex,sed,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.
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.
有什么想法吗?sed没有前瞻功能,但您可以描述所有可能性:
sed -e 's/\(- \(- \)*\)\([^o]\|$\|o\([^g]\|$\)\)/\3/g'
您可以使用:---og--oa-o=>-og oa o测试它sed不提供前瞻功能,但您可以描述所有可能性:
sed -e 's/\(- \(- \)*\)\([^o]\|$\|o\([^g]\|$\)\)/\3/g'
您可以使用:---og--oa-o=>-og oa o来测试它。您还可以使用sed链,首先将-og替换为像booogabooga这样没有意义的东西,然后执行替换,然后反转booogabooga
某些版本的sed可能需要:
sed -e 's/- og/booogabooga/g' -e 's/- //g' -e 's/booogabooga/- og/g'
这可能会更慢、更痛苦,特别是如果您按照@Kusalananda的建议进行多次替换,但这更容易理解。您也可以使用sed链,首先将-og替换为像booogabooga这样毫无意义的东西,然后执行替换,然后反转booogabooga
某些版本的sed可能需要:
sed -e 's/- og/booogabooga/g' -e 's/- //g' -e 's/booogabooga/- og/g'
这可能会更慢、更痛苦,特别是如果你有@Kusalananda建议的多个替代品,但更容易理解。鉴于我添加的这个输入文件-ellers,因为你在评论中说你也需要处理它们:
$ 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
上面的工作原理是将目标字符串中不包含的所有as或任何其他字符转换为aA,这样我们就可以将我们感兴趣的字符串,-og和-eller转换为a,例如aB和aC,此时我们知道输入中唯一出现的aB和aC是新转换的-og和-eller,因为所有现有as现在都是aA
现在我们可以从文件中删除所有剩余的-s,然后将aCs转换回-eller,将aBs转换回-ogs,最后将所有aAs转换回原始as。鉴于此输入文件,我添加了-ellers,因为您在评论中说您也需要处理它们:
$ 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
上面的工作原理是将目标字符串中不包含的所有as或任何其他字符转换为aA,这样我们就可以将我们感兴趣的字符串,-og和-eller转换为a,例如aB和aC,此时我们知道输入中唯一出现的aB和aC是新转换的-og和-eller,因为所有现有as现在都是aA
现在,我们可以从文件中删除所有剩余的-s,然后将aCs转换回-eller,将aBs转换回-ogs,最后将所有aAs转换回原始as。这可能适用于GNU-sed:
sed -r 's/(- (og|eller))|- /\1/g' file
这依赖于替换以重新替换特定案例和空的backreference来替换一般案例。这可能适用于GNU-sed:
sed -r 's/(- (og|eller))|- /\1/g' file
这依赖于替换来重新替换特定案例和空的backreference来替换一般案例。AFAIK,sed不支持lookaheads和lookbehinds。。您可以使用perl代替sed,sed不支持lookaheads和lookbehinds。。你可以使用perl代替它,这将为og和挪威语工作,但他可能还需要寻找eller或者……你是对的!我也需要找埃勒。这对og和挪威语都有效,但他可能也需要找埃勒或者……你说得对!我还需要寻找eller。安全、惯用的方法是创建一个或多个输入中不存在的字符串,而不是尝试猜测一个。“看,”埃德蒙顿说。现在我在谷歌上搜索了一下,发现了一些我认为是我编造出来的难以置信的东西。是的,不幸的是,使用$'\n'作为临时替换字符串甚至不是100%安全的,以防有人使用hold space/buffer/time warp巫毒咒语强迫sed执行多行操作。保险箱,惯用的方法是创建一个或多个输入中不存在的字符串,而不是尝试猜测一个。“看,”埃德蒙顿说。现在我用谷歌搜索它,有一些我认为是我刚刚编出来的。是的,不幸的是,使用$'\n'作为临时替换字符串甚至不是100%安全的,以防有人使用保持空间/缓冲区/时间扭曲巫毒咒语强迫sed做多行的事情。