Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用sed匹配后面没有单词的字符串_Regex_Sed - Fatal编程技术网

Regex 如何使用sed匹配后面没有单词的字符串

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.

我需要删除所有由连字符后跟空格组成的字符串,但仅当空格后面没有单词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.

有什么想法吗?

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做多行的事情。